在使用opencv的过程中,实际情况常常需要对线段、圆形、颜色等条件的判断,但是网上多给出一些图像处理的数据,没有给出我需要的判定结果。在尝试后记录了两端代码供之后使用
对于线段的判断
输出结果为线段长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| img = cv2.imread("data/img/file.jpeg") img=img[0:int(img.shape[0]*0.9),0:int(img.shape[1]*0.9)] gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3) lines = cv2.HoughLinesP(edges,1,np.pi/360,100,minLineLength=int(img.shape[1]*0.7),maxLineGap=10)
def draw_line(img,lines): for line_points in lines: lenth = (line_points.max()-line_points.min())/img.shape[1] print(lenth) cv2.line(img,(line_points[0][0],line_points[0][1]),(line_points[0][2],line_points[0][3]),(0,255,0),2,8,0) cv2.imshow("line_img", img) cv2.waitKey(0)
draw_line(img,lines)
|
对于颜色判断
红色的色域十分特殊,有两端色域,因此需要将两次结果相加,但是需要注意的是,图像上呈现的视觉颜色并不一定是色域颜色,你看到蓝色可能是参杂了红色的蓝色,因此判断可能会有一点点误差。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| def red_img(path:str="data/img/file.jpeg")->bool: img = cv2.imread(path) img=img[0:int(img.shape[0]/3),0:int(img.shape[1]/10)] grid_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
grid_HSV = cv2.cvtColor(grid_RGB, cv2.COLOR_RGB2HSV)
lower1 = np.array([0, 43, 46]) upper1 = np.array([10, 255, 255]) mask1 = cv2.inRange(grid_HSV, lower1, upper1) res1 = cv2.bitwise_and(grid_RGB, grid_RGB, mask=mask1)
lower2 = np.array([156, 43, 46]) upper2 = np.array([180, 255, 255]) mask2 = cv2.inRange(grid_HSV, lower2, upper2) res2 = cv2.bitwise_and(grid_RGB, grid_RGB, mask=mask2)
mask3 = mask1 + mask2 list_info = [i.max() for i in mask3] if list_info.count(255)/len(list_info) > 0.1: return True return False
|