在使用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)] #高,宽
# 在彩色图像的情况下,解码图像将以b g r顺序存储通道。
grid_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 从RGB色彩空间转换到HSV色彩空间
grid_HSV = cv2.cvtColor(grid_RGB, cv2.COLOR_RGB2HSV)

# 函数inRange将不是这个色域的地方全部改为0,因此可以通过这样的方式判断究竟多少部分被划分为了指定的颜色
# H、S、V范围一:
lower1 = np.array([0, 43, 46])
upper1 = np.array([10, 255, 255])
mask1 = cv2.inRange(grid_HSV, lower1, upper1) # mask1 为二值图像
res1 = cv2.bitwise_and(grid_RGB, grid_RGB, mask=mask1)

# # H、S、V范围二:
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
# cv2.imshow("mask3", mask3)
# cv2.imshow("grid_RGB", grid_RGB[:, :, ::-1])
# cv2.waitKey(0)
# cv2.destroyAllWindows()
list_info = [i.max() for i in mask3]
if list_info.count(255)/len(list_info) > 0.1:
return True # 如果红色面积大于10%则判定为红色
return False