Advertisement

opencv 识别矩形java_使用OpenCV进行矩形检测/跟踪

阅读量:

HSV空间中的H通道是Hue,它对光线变化不敏感 . 红色范围约为[150,180] .

根据提到的信息,我做了以下工作 .

切换到HSV空间,拆分H通道,阈值并将其标准化 .

应用变形操作(打开)

查找轮廓,按某些属性(宽度,高度,面积,比率等)进行过滤 .

PS . 由于NETWORK,我无法获取您在Dropbox上传的图像 . 所以,我只使用crop the right side of your second image作为输入 .
40bf36c9-54fd-4db6-bbd0-0d7f52894119.png

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,打开):
006f98aa-2f99-459f-9ee2-c77fb8d5c835.png

然后找到轮廓并过滤它们 .

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
9419a79e-6153-4782-a2b3-605e0d3cdb15.png

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

全部评论 (0)

还没有任何评论哟~