Python+OpenCV如何实现基于颜色的目标识别(opencv,python,开发技术)

时间:2024-05-04 19:15:29 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

任务

让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。

Python+OpenCV如何实现基于颜色的目标识别

因为场地固定,背景单一,所以省下来很多操作和处理。于是就有两种解决思路:第一种是基于气球形状做轮廓提取,只要是闭合椭圆或圆形形就认为是目标物体;第二种是基于气球颜色,只要符合目标物体的颜色就认为是目标物体。

因为摄像头是装在四足机器人(它的任务是去扎气球)身上的,所以它如果移动到摄像头视野范围内气球不成闭合椭圆或圆形的时候就无法识别了,再加上场地灯光而产生的阴影的问题,在初步实践中发现经过图像处理的气球不一定是闭合球形的。所以这种方法被我否决了。

于是我就采用了第二种方法,实现思路大概如下:

首先对图像进行形态学处理,具体为将读入的灰度图进行一次滤波操作,将图像转化成HSV图,然后进行腐蚀操作。接着就对目标颜色进行识别和提取。然后提取图像的轮廓,过滤掉轮廓围成面积较小的物体后将剩余物体视为目标。接下来就绘制目标的外接矩形(不必要,用于调试。当然也为了帅气的视觉效果)。最后计算目标的中心点,返回中心点,并绘制在图上。

话不多说我们来看一下具体的代码实现吧

主要代码

importcv2#importmatplotlib.pyplotaspltimportnumpyasnp#定义一个展示图片的函数defcv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()#定义一个形态学处理的函数defgood_thresh_img(img):gs_frame=cv2.GaussianBlur(img,(5,5),0)#高斯滤波hsv=cv2.cvtColor(gs_frame,cv2.COLOR_BGR2HSV)#转化成HSV图像erode_hsv=cv2.erode(hsv,None,iterations=2)returnerode_hsv#定义一个识别目标颜色并处理的函数defselect_color_img(target_color,img):foriintarget_color:mask=cv2.inRange(erode_hsv,color_dist[i]['Lower'],color_dist[i]['Upper'])if(i==target_color[0]):inRange_hsv=cv2.bitwise_and(erode_hsv,erode_hsv,mask=mask)cv_show('res',inRange_hsv)#不必要,用于调试else:inRange_hsv1=cv2.bitwise_and(erode_hsv,erode_hsv,mask=mask)cv_show('res1',inRange_hsv1)#不必要,用于调试inRange_hsv=cv2.add(inRange_hsv,inRange_hsv1)cv_show('res2',inRange_hsv)#不必要,用于调试returninRange_hsv#定义一个提取轮廓的函数defextract_contour(img):inRange_gray=cv2.cvtColor(final_inRange_hsv,cv2.COLOR_BGR2GRAY)contours,hierarchy=cv2.findContours(inRange_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)returncontours#定义一个寻找目标并绘制外接矩形的函数deffind_target(contours,draw_img):forcincontours:ifcv2.contourArea(c)<2000:#过滤掉较面积小的物体continueelse:target_list.append(c)#将面积较大的物体视为目标并存入目标列表foriintarget_list:#绘制目标外接矩形rect=cv2.minAreaRect(i)box=cv2.boxPoints(rect)cv2.drawContours(draw_img,[np.int0(box)],-1,(0,255,255),2)returndraw_img#定义一个绘制中心点坐标的函数defdraw_center(target_list,draw_img):forcintarget_list:M=cv2.moments(c)#计算中心点的x、y坐标center_x=int(M['m10']/M['m00'])center_y=int(M['m01']/M['m00'])print('center_x:',center_x)#打印(返回)中心点的x、y坐标print('center_y:',center_y)cv2.circle(draw_img,(center_x,center_y),7,128,-1)#绘制中心点str1='('+str(center_x)+','+str(center_y)+')'#把坐标转化为字符串cv2.putText(draw_img,str1,(center_x-50,center_y+40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),2,cv2.LINE_AA)#绘制坐标点位returndraw_img###主函数部分#创建颜色字典color_dist={'red':{'Lower':np.array([0,60,60]),'Upper':np.array([6,255,255])},'yellow':{'Lower':np.array([15,160,50]),'Upper':np.array([35,255,255])},'green':{'Lower':np.array([50,50,50]),'Upper':np.array([130,255,255])},}#目标颜色target_color=['green','yellow']#创建目标列表target_list=[]img=cv2.imread(r'D:lesson\balloom.jpg',cv2.COLOR_BGR2RGB)#读入图像(直接读入灰度图)draw_img=img.copy()#为保护原图像不被更改而copy了一份,下面对图像的修改都是对这个副本进行的erode_hsv=good_thresh_img(img)final_inRange_hsv=select_color_img(target_color,erode_hsv)contours=extract_contour(final_inRange_hsv)draw_img=find_target(contours,draw_img)final_img=draw_center(target_list,draw_img)cv_show('final_img',final_img)

效果展示

颜色提取效果:

Python+OpenCV如何实现基于颜色的目标识别

Python+OpenCV如何实现基于颜色的目标识别

Python+OpenCV如何实现基于颜色的目标识别

绘制外接矩形及中心点的效果:

Python+OpenCV如何实现基于颜色的目标识别

Python+OpenCV如何实现基于颜色的目标识别

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Python+OpenCV如何实现基于颜色的目标识别的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:JAVA中变量类型间如何相互转换下一篇:

17 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18