opencv颜色识别物体并用矩形框框起来

it2025-03-15  26

识别出指定颜色的物体,然后进行滤波,边缘检测,最后用矩形框把图中的长方形框出来。

HSV颜色分量范围:https://blog.csdn.net/u013270326/article/details/80704754

import cv2 import numpy as np from sympy import Point from sympy.vector import vector img = cv2.imread('demo/667.jpg') # 颜色转换函数 转换为hsv cv2.COLOR_BGR2HSV hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) low_hsv = np.array([11, 43, 46]) high_hsv = np.array([25, 255, 255]) # mask是只突出指定颜色的图片 mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=high_hsv) # 中值滤波降噪 median = cv2.medianBlur(mask, 5) # 进行边缘检测 cannyPic = cv2.Canny(median, 10, 200) line = 50 minLineLength = 10 maxLineGap = 150 # 检测直线函数,能输出检测到的直线端点 lines = cv2.HoughLinesP(cannyPic, 1, np.pi / 180, 120, lines=line, minLineLength=minLineLength, maxLineGap=maxLineGap) lines1 = lines[:, 0, :] # line()划线函数 for x1, y1, x2, y2 in lines1: cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2) contours, hierarchy = cv2.findContours(cannyPic, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) for c in contours: rect = cv2.minAreaRect(c) box_ = cv2.boxPoints(rect) h = abs(box_[3, 1] - box_[1, 1]) w = abs(box_[3, 0] - box_[1, 0]) box = cv2.boxPoints(rect) # 计算最小面积矩形的坐标 box = np.int0(box) # 将坐标规范化为整数 angle = rect[2] if angle > 20: continue # 绘制矩形 cv2.drawContours(img, [box], 0, (255, 0, 0), 3) # -1是画出所有边缘 draw_img3 = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 3) cv2.namedWindow("test", 0) cv2.namedWindow("median", 0) cv2.namedWindow("cannyPic", 0) cv2.namedWindow("draw_img3", 0) cv2.namedWindow("img_3", 0) cv2.imshow("test", mask) cv2.imshow("median", median) cv2.imshow("cannyPic", cannyPic) cv2.imshow("img_3", img) cv2.imshow("draw_img3", draw_img3) cv2.waitKey(0) cv2.destroyAllWindows()

 如图所示,蓝色方块标识的就是所要找的橙色方块

 

最新回复(0)