在使用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
   |