我们首先学习了OpenCV的基础知识,然后对图像进行了一些基本的图像处理和操作,然后进行了图像分割以及使用OpenCV和python语言进行的许多其他操作。在本节中,我们将使用模板匹配执行一些简单的对象检测技术。我们将在图像中找到一个对象,然后描述其特征。特征是图像的常见属性,例如角,边等。我们还将介绍一些常见且流行的对象检测算法,例如SIFT,SURF,FAST,BREIF和ORB。
如之前的教程所述, OpenCV是开源通勤者视觉库 ,具有C ++,Python和Java接口,并支持Windows,Linux,Mac OS,iOS和Android。因此,可以在具有Python和Linux环境的Raspberry Pi中轻松安装它。带有OpenCV和附加摄像头的Raspberry Pi可用于创建许多实时图像处理应用程序,例如人脸检测,人脸锁,物体跟踪,汽车车牌检测,家庭安全系统等。
对象检测和识别形成了计算机视觉最重要的用例,它们被用来做强大的事情,例如
- 标记场景
- 机器人导航
- 自动驾驶汽车
- 身体识别(Microsoft Kinect)
- 疾病和癌症检测
- 面部识别
- 手写识别
- 识别卫星图像中的物体
物体检测与识别
对象识别是对象检测的第二级,其中计算机能够从图像中的多个对象中识别出一个对象,并且可能能够识别该对象。
现在,我们将执行一些图像处理功能以从图像中查找对象。
从图像中查找对象
在这里,我们将使用模板匹配来查找图像中的字符/对象,使用OpenCV的 cv2.matchTemplate() 函数来查找该对象
导入cv2 导入numpy作为np
加载输入图像并将其转换为灰色
image = cv2.imread('WaldoBeach.jpg') cv2.imshow('people',image) cv2.waitKey(0) gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
加载模板图片
template = cv2.imread('waldo.jpg',0) #图像上对象模板匹配的 结果= cv2.matchTemplate(gray,template,cv2.TM_CCOEFF) sin_val,max_val,min_loc,max_loc = cv2.minMaxLoc(结果)
创建边界框
top_left = max_loc #将边界矩形的大小增加50个像素 bottom_right =(top_left + 50,top_left + 50) cv2.rectangle(image,top_left,bottom_right,(0,255,0),5) cv2.imshow('找到对象' ,image) cv2.waitKey(0) cv2.destroyAllWindows()
在 cv2.matchTemplate(gray,template,cv2.TM_CCOEFF)中 ,输入灰度图像以找到对象和模板。然后应用模板匹配方法从图像中查找对象,此处使用 cv2.TM_CCOEFF 。
整个函数返回结果输入的数组,该结果是模板匹配过程的结果。
然后,我们使用 cv2.minMaxLoc(result) ,它给出在图像中找到对象的坐标或边界框,当我们获得这些坐标时,在其上绘制一个矩形,并拉伸该框的一些尺寸,以便对象可以轻松地放入矩形内部。
有多种执行模板匹配的方法,在这种情况下,我们使用 cv2.TM_CCOEFF 表示相关系数。
这里的关键点是使用筛选检测器提取的(X,Y)坐标,并使用cv2绘制关键点函数在图像上绘制。
冲浪
导入cv2 导入numpy作为np 图像= cv2.imread('paris.jpg') 灰色= cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY)
创建SURF Feature Detector对象,这里我们将粗略阈值设置为500
surf = cv2.xfeatures2d.SURF_create(500) 关键点,描述符= surf.detectAndCompute(灰色,无) 打印(“检测到的关键点数量:”,len(关键点))
在输入图像上绘制丰富的关键点
图像= cv2.drawKeypoints(图像,关键点,无,标志= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow('特征方法 -SURF ',图像)cv2.waitKey()cv2.destroyAllWindows()
控制台输出:
快速
导入cv2 导入numpy作为np 图像= cv2.imread('paris.jpg') 灰色= cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY)
创建FAST Detector对象
fast = cv2.FastFeatureDetector_create() #获取关键点,默认情况下,非最大抑制为On #关闭设置fast.setBool('nonmaxSuppression',False) 关键点= fast.detect(gray,None) print(“关键点数量检测到:“,len(keypoints))
在输入图像上绘制丰富的关键点
图像= cv2.drawKeypoints(图像,关键点,无,标志= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow('特征方法-快速',图像) cv2.waitKey() cv2.destroyAllWindows()
控制台输出:
简要
导入cv2 导入numpy作为np 图像= cv2.imread('paris.jpg') 灰色= cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY)
创建FAST检测器对象
简要= cv2.xfeatures2d.BriefDescriptorExtractor_create()
创建摘要提取器对象
#brief = cv2.DescriptorExtractor_create(“ BRIEF”) #确定关键点 关键点= fast.detect(灰色,无)
使用Brief获取描述符和新的最终关键点
关键点,描述符= brief.compute(灰色,关键点) 打印(“检测到的关键点数:”,len(关键点))
在输入图像上绘制丰富的关键点
图像= cv2.drawKeypoints(图像,关键点,无,标志= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow('特征方法-简明',图像)cv2.waitKey()cv2.destroyAllWindows()
控制台输出:
天体
导入cv2 导入numpy作为np 图像= cv2.imread('paris.jpg') 灰色= cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY)
创建ORB对象,我们可以指定所需的关键点数量
orb = cv2.ORB_create() #确定关键点 关键点= orb.detect(灰色,无)
获取描述符
关键点,描述符= orb.compute(灰色,关键点) print(“检测到的关键点数:”,len(关键点)
在输入图像上绘制丰富的关键点
图片= cv2.drawKeypoints(图片,关键点,无,标志= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow('特征方法 -ORB ',图片)cv2.waitKey()cv2.destroyAllWindows()
控制台输出:
我们可以指定最大数量为5000的关键点数量,但是默认值为500,即,如果未为任何关键点值指定,ORB会自动检测到最佳的500个关键点。
因此,这就是在OpenCV中进行对象检测的方式,相同的程序也可以在安装了OpenCV的Raspberry Pi中运行,并且可以用作具有Google Lens的智能手机之类的便携式设备。
本文引用了Rajeev Ratan创建的Udemy上的Python with Deep Learning课程中的Master Computer Vision™OpenCV4 in Python with Deep Learning课程,订阅该课程以了解有关Computer Vision和Python的更多信息。