一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来识别物体,找到画面中的方形物体并将其框出。
二、知识目标
学习使用opencv进行图像处理及形状检测的方法。
三、实践准备
硬件清单:
四、实践过程
1、硬件搭建
1、 将摄像头接入行空板的USB接口。
2、通过USB连接线将行空板连接到计算机。
2、软件编写
第一步:打开Mind+,远程连接行空板
第二步:在“行空板的文件”中新建一个名为AI的文件夹,在其中再新建一个名为“基于行空板的opencv方形检测”的文件夹,导入本节课的依赖文件。
附件
第三步:编写程序
在上述文件的同级目录下新建一个项目文件,并命名为“main.py”。
示例程序:
#!/usr/bin/env python
'''
Simple "Square Detector" program.
Loads several images sequentially and tries to find squares in each image.
'''
# 导入必要的库
from __future__ import print_function
import sys
PY3 = sys.version_info[0] == 3
if PY3:
xrange = range
import numpy as np
import cv2 as cv
import video
def angle_cos(p0, p1, p2):
# 计算三个点之间的余弦值
d1, d2 = (p0-p1).astype('float'), (p2-p1).astype('float')
return abs( np.dot(d1, d2) / np.sqrt( np.dot(d1, d1)*np.dot(d2, d2) ) )
def find_squares(img):
# 对图像进行高斯模糊
img = cv.GaussianBlur(img, (5, 5), 0)
squares = []
for gray in cv.split(img):
for thrs in xrange(0, 255, 26):
if thrs == 0:
# 对灰度图像进行Canny边缘检测
bin = cv.Canny(gray, 0, 50, apertureSize=5)
bin = cv.dilate(bin, None)
else:
# 对灰度图像进行二值化
_retval, bin = cv.threshold(gray, thrs, 255, cv.THRESH_BINARY)
# 寻找图像中的轮廓
contours, _hierarchy = cv.findContours(bin, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
for cnt in contours:
# 对轮廓进行逼近
cnt_len = cv.arcLength(cnt, True)
cnt = cv.approxPolyDP(cnt, 0.02*cnt_len, True)
if len(cnt) == 4 and cv.contourArea(cnt) > 1000 and cv.isContourConvex(cnt):
cnt = cnt.reshape(-1, 2)
# 计算四个角点之间的最大余弦值
max_cos = np.max([angle_cos( cnt[i], cnt[(i+1) % 4], cnt[(i+2) % 4] ) for i in xrange(4)])
if max_cos < 0.1:
squares.append(cnt)
return squares
def main():
# 创建视频捕获对象
cap = video.create_capture(0)
# 创建全屏窗口
cv.namedWindow('squares',cv.WND_PROP_FULLSCREEN)
cv.setWindowProperty('squares', cv.WND_PROP_FULLSCREEN, cv.WINDOW_FULLSCREEN)
while True:
# 读取一帧图像
_flag, img = cap.read()
# 在图像中查找方块
squares = find_squares(img)
# 绘制找到的方块轮廓
cv.drawContours( img, squares, -1, (0, 255, 0), 3 )
# 显示图像
cv.imshow('squares', img)
ch = cv.waitKey(1)
# 按下ESC键退出程序
if ch == 27:
break
if __name__ == '__main__':
print(__doc__)
main()
cv.destroyAllWindows()
3、运行调试
第一步:运行主程序
运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准方形物体,可以看到该物体被检测出来并框出。
4、程序解析
在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,获取实时视频流,并借助传统的计算机视觉算法和技术来实现方形物体的检测。整体流程如下,
①捕获摄像头的视频流:程序首先打开摄像头,获取实时的视频流。
②对视频流中的每一帧进行处理:程序会逐帧读取视频流,对每一帧进行处理。处理的第一步是将图像进行高斯模糊,然后对图像进行颜色空间分离。
③找出图像中的方形物体:对每个颜色通道,程序会通过Canny算法或阈值分割找出图像的边缘,然后通过查找轮廓的方法找出图像中的物体。对于每个找出的轮廓,程序会计算其长度并进行多边形逼近,找出边数为4、面积大于1000、并且是凸形状的轮廓,这些轮廓即为可能的方形物体。
④判断找出的轮廓是否为方形:对于每个可能的方形物体,程序会计算其角点之间的最大余弦值,如果最大余弦值小于0.1,则认为这个轮廓是一个方形物体。
⑤绘制并显示结果:将找出的方形物体在原图像上标记出来,并在窗口中显示处理后的图像。
⑥用户交互:程序会检测用户是否按下了ESC键,如果按下则退出程序。
⑦循环:程序会不断重复上述步骤,直到用户选择退出。
五、知识园地
1. 了解图像处理中的高斯模糊(Gaussian Blur)
高斯模糊,也称为高斯平滑或高斯滤波,是一种广泛用于图像处理的技术。它的主要作用是减少图像的细节和噪声,使图像变得更加平滑。
高斯模糊的原理基于数学中的高斯函数,也就是正态分布曲线。在图像处理中,高斯模糊是通过将每个像素的颜色值替换为其邻近像素颜色值的加权平均来实现的。这个加权平均的权重就是根据高斯函数计算出来的,距离当前像素越近的像素权重越大,距离越远的像素权重越小。
在OpenCV中,可以使用cv2.GaussianBlur()函数来对图像进行高斯模糊。这个函数需要指定高斯核的宽度和高度(必须是奇数),以及在X和Y方向上的标准差。
高斯模糊是许多图像处理算法的预处理步骤,例如边缘检测、特征提取等。通过高斯模糊,可以消除图像中的小的纹理和噪声,使得这些算法能够更加准确地找到真正的边缘和特征。
2. 了解图像处理中的边缘检测(Canny Edge Detection)
边缘检测是计算机视觉和图像处理中的一个重要技术,它的目标是在图像中定位物体边界的显著性变化。边缘检测算法通常通过检测图像强度函数的快速变化来找到边缘。
边缘检测的重要性在于,边缘通常是物体的边界,可以提供物体的形状和位置信息。此外,由于边缘只包含图像的一个小部分,但却包含了大部分的信息,因此边缘检测还常常被用于减少需要处理的数据量,并消除不必要的信息,使得图像处理的任务变得更简单。
边缘检测通常包括三个步骤:滤波、增强和检测。滤波通常用于去除图像中的噪声;增强则是通过找出图像中的梯度和方向来突出显示边缘;检测则是通过非极大值抑制和滞后阈值等步骤来确定真正的边缘。
常见的边缘检测算法有Sobel算子、Prewitt算子、Laplacian算子、Canny边缘检测等。其中,Canny边缘检测算法是最为知名和广泛使用的一种,它能够提供良好的边缘定位,并且对噪声具有良好的抑制能力。
谭周强2024.08.17
66666