python OpenCV GrabCut使用实例解析
这篇文章主要介绍了pythonOpenCVGrabCut使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
先上一个效果图:
使用Python3.7+OpenCV3.x.
需要引入numpy库。
在图上用鼠标左键和右键标记前景和后景即可.
如果需要重新标记图像,关闭程序重新运行.
以下是具体实现代码
#-*-coding:utf-8-*-
'''
Python:3.5.7
opencv3.x
在图上用鼠标左键和右键标记前景和后景即可.
如果需要重新标记图像,关闭程序重新运行.
ByYnxfhttp://www.zhouws.com
'''
importcv2
importnumpyasnp
importtime
img_src='../test_images/3.jpg'
drawing=False
mode=False
classGrabCut:
def__init__(self,t_img):
self.img=t_img
self.img_raw=img.copy()
self.img_width=img.shape[0]
self.img_height=img.shape[1]
self.scale_size=640*self.img_width//self.img_height
ifself.img_width>640:
self.img=cv2.resize(self.img,(640,self.scale_size),interpolation=cv2.INTER_AREA)
self.img_show=self.img.copy()
self.img_gc=self.img.copy()
self.img_gc=cv2.GaussianBlur(self.img_gc,(3,3),0)
self.lb_up=False
self.rb_up=False
self.lb_down=False
self.rb_down=False
self.mask=np.full(self.img.shape[:2],2,dtype=np.uint8)
self.firt_choose=True
#鼠标的回调函数
defmouse_event2(event,x,y,flags,param):
globaldrawing,last_point,start_point
#左键按下:开始画图
ifevent==cv2.EVENT_LBUTTONDOWN:
drawing=True
last_point=(x,y)
start_point=last_point
param.lb_down=True
print('mouselbdown')
elifevent==cv2.EVENT_RBUTTONDOWN:
drawing=True
last_point=(x,y)
start_point=last_point
param.rb_down=True
print('mouserbdown')
#鼠标移动,画图
elifevent==cv2.EVENT_MOUSEMOVE:
ifdrawing:
ifparam.lb_down:
cv2.line(param.img_show,last_point,(x,y),(0,0,255),2,-1)
cv2.rectangle(param.mask,last_point,(x,y),1,-1,4)
else:
cv2.line(param.img_show,last_point,(x,y),(255,0,0),2,-1)
cv2.rectangle(param.mask,last_point,(x,y),0,-1,4)
last_point=(x,y)
#左键释放:结束画图
elifevent==cv2.EVENT_LBUTTONUP:
drawing=False
param.lb_up=True
param.lb_down=False
cv2.line(param.img_show,last_point,(x,y),(0,0,255),2,-1)
ifparam.firt_choose:
param.firt_choose=False
cv2.rectangle(param.mask,last_point,(x,y),1,-1,4)
print('mouselbup')
elifevent==cv2.EVENT_RBUTTONUP:
drawing=False
param.rb_up=True
param.rb_down=False
cv2.line(param.img_show,last_point,(x,y),(255,0,0),2,-1)
ifparam.firt_choose:
param.firt_choose=False
param.mask=np.full(param.img.shape[:2],3,dtype=np.uint8)
cv2.rectangle(param.mask,last_point,(x,y),0,-1,4)
print('mouserbup')
if__name__=='__main__':
img=cv2.imread(img_src)
ifimgisNone:
print('error:图像为空')
g_img=GrabCut(img)
cv2.namedWindow('image')
#定义鼠标的回调函数
cv2.setMouseCallback('image',mouse_event2,g_img)
while(True):
cv2.imshow('image',g_img.img_show)
ifg_img.lb_uporg_img.rb_up:
g_img.lb_up=False
g_img.rb_up=False
start=time.process_time()
bgdModel=np.zeros((1,65),np.float64)
fgdModel=np.zeros((1,65),np.float64)
rect=(1,1,g_img.img.shape[1],g_img.img.shape[0])
print(g_img.mask)
mask=g_img.mask
g_img.img_gc=g_img.img.copy()
cv2.grabCut(g_img.img_gc,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_MASK)
elapsed=(time.process_time()-start)
mask2=np.where((mask==2)|(mask==0),0,1).astype('uint8')#0和2做背景
g_img.img_gc=g_img.img_gc*mask2[:,:,np.newaxis]#使用蒙板来获取前景区域
cv2.imshow('result',g_img.img_gc)
print("Timeused:",elapsed)
#按下ESC键退出
ifcv2.waitKey(20)==27:
break
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。