在图切算法和目标跟踪交互的时候,往往需要用鼠标选定目标。用opencv+python实现画框选定目标和后续实现grabcut,代码如下。尤其注意画框时候的实时更新,否则画出来是实心的方块

import cv2

import numpy as np

ix,iy = -1,-1

bx,by = -1,-1

i=1

def draw(event,x,y,flags,param):

global ix,iy,bx,by,i

if event == cv2.EVENT_LBUTTONDOWN:

print('按下鼠标')

ix, iy = x,y

print('坐标1:',str(ix),str(iy))

elif event == cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:

if i ==1:

print('鼠标滑动')

i = i+1

if i >1:

pass

img = img1.copy()#实时更新这一步很重要,如果没有这一步画出来会是一个方块

cv2.rectangle(img, (ix, iy), (x, y), (0, 0, 255), 3)

cv2.imshow('iron', img)

elif event == cv2.EVENT_LBUTTONUP:

print('鼠标抬起')

bx, by = x, y

print('坐标2:',str(bx),str(by))

img = cv2.imread('D:/00000022.jpg',1)

img1 = img.copy()#为了上面的实时更新方框,如果不更新,最后是一个实心方块

cv2.namedWindow('iron',cv2.WINDOW_NORMAL)

cv2.imshow('iron',img1)#第一次显示

cv2.setMouseCallback('iron',draw)#回调鼠标

cv2.waitKey(0)

cv2.destroyAllWindows()

#下面是图切算法部分

print(img.shape[:2])#

mask = np.zeros(img.shape[:2], dtype=np.uint8)#src.shape[:2]=(500,700)

rect = (ix,iy,bx,by)#(50,0)roi边框左上角坐标。(580,500):...右下角坐标

bgdmodel = np.zeros((1,65),np.float64)#后台模型的临时数组。

fgdmodel = np.zeros((1,65),np.float64)#前台模型的临时数组。

cv2.grabCut(img,mask,rect,bgdmodel,fgdmodel,7,mode=cv2.GC_INIT_WITH_RECT)#7:算法迭代次数;算法收敛前,迭代次数越高效果越好;本例,迭代7次达到最优

mask2 = np.where((mask==1) | (mask==3), 255, 0).astype('uint8')

result = cv2.bitwise_and(img,img,mask=mask2)

cv2.imshow("result", result)

cv2.waitKey(0)

cv2.destroyAllWindows()

# save_dizhi = '.\demo-sequences/vot15_bag3result/imgs/0000'+str(i)+'.jpg'

# cv.imwrite(save_dizhi,result)

# cv.waitKey(0)

# cv.destroyAllWindows()

84c1d071bc04b32c7928dbda36bdefbb.png

fc3146eaab0ca1391258e11a69370bbd.png

eba773f8426cee002a72201cbda611a3.png

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐