opencv 识别矩形java_使用OpenCV进行矩形检测/跟踪
HSV空间中的H通道是Hue,它对光线变化不敏感 . 红色范围约为[150,180] .
根据提到的信息,我做了以下工作 .
切换到HSV空间,拆分H通道,阈值并将其标准化 .
应用变形操作(打开)
查找轮廓,按某些属性(宽度,高度,面积,比率等)进行过滤 .
PS . 由于NETWORK,我无法获取您在Dropbox上传的图像 . 所以,我只使用crop the right side of your second image作为输入 .

imgname = "src.png"
img = cv2.imread(imgname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Split the H channel in HSV, and get the red range
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)
h[h<150]=0
h[h>180]=0
normalize, do the open-morp-op
normed = cv2.normalize(h, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8UC1)
kernel = cv2.getStructuringElement(shape=cv2.MORPH_ELLIPSE, ksize=(3,3))
opened = cv2.morphologyEx(normed, cv2.MORPH_OPEN, kernel)
res = np.hstack((h, normed, opened))
cv2.imwrite("tmp1.png", res)
现在,我们得到结果(h,normed,打开):

然后找到轮廓并过滤它们 .
contours = cv2.findContours(opened, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))[-2]
bboxes = []
rboxes = []
cnts = []
dst = img.copy()
for cnt in contours:
Get the stright bounding rect
bbox = cv2.boundingRect(cnt)
x,y,w,h = bbox
if w<30 or h < 30 or w*h < 2000 or w > 500:
continue
Draw rect
cv2.rectangle(dst, (x,y), (x+w,y+h), (255,0,0), 1, 16)
Get the rotated rect
rbox = cv2.minAreaRect(cnt)
(cx,cy), (w,h), rot_angle = rbox
print("rot_angle:", rot_angle)
backup
bboxes.append(bbox)
rboxes.append(rbox)
cnts.append(cnt)
结果是这样的:
rot_angle: -2.4540319442749023
rot_angle: -1.8476102352142334

因为源图像中的蓝色矩形标签,卡被分成两侧 . 但是干净的图像没有问题 .
