失败笔记本-OPENCV篇-001
项目场景:
今天研究一下用OPENCV基于轮廓分析查找数字,参考地址为:OpenCV案例|基于轮廓分析查找数字
实现的效果如下:
1.打开一张图片
步骤:
- 首先呢还是丝滑小连招,打开图片,灰度化,二值化
- 在opencv中使用imread打开图片,使用imshow展示图片,不过要注意在imshow后面要接着waitkey()
- imread中其实可以选择用灰度打开,但是好像并不是实现灰度化还是需要色彩空间转换,使用cvtColor函数
- 在二值化之前先模糊一下去噪,高斯模糊用的是GaussianBlur函数
- 二值化这里用的是自适应二值化,adaptiveThreshold
代码如下:
source = cv2.imread('001.png',cv.COLOR_BGR2GRAY)
gary_img = cv2.cvtColor(source,cv.COLOR_BGR2GRAY)
blurred_img = cv2.GaussianBlur(source,(7,7),0)
# 应用自适应阈值二值化
max_value = 255
block_size = 13
constant = 21
result = cv2.adaptiveThreshold (gary_img, max_value, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, block_size, constant)
- 在这步操作中,最重要的就是自适应二值化操作了
cv2.adaptiveThreshold 函数是OpenCV中用于图像处理的自适应阈值二值化方法,以下是该函数的主要参数及其详细说明:
src:输入图像,必须为单通道灰度图像。
maxValue:满足条件的像素点赋予的最大值,通常为255。
adaptiveMethod:自适应阈值算法的选择:
cv2.ADAPTIVE_THRESH_MEAN_C:使用局部均值作为阈值。
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:使用局部高斯加权均值作为阈值。
thresholdType:阈值类型:
cv2.THRESH_BINARY:如果像素值大于阈值,则输出255;否则输出0。
cv2.THRESH_BINARY_INV:如果像素值大于阈值,则输出0;否则输出255。
blockSize:用于计算局部均值或高斯加权均值的块大小。
C:常数项,用于从计算出的局部均值或高斯加权均值中减去,以得到最终的阈值
2.轮廓查找和分析
步骤:
- 做完二值之后就是查找轮廓
- 找完轮廓就可以对轮廓进行分析,筛选合适的面积、长度
- 画出轮廓的外接矩形就OK
代码如下:
contours, _ = cv2.findContours(result, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
for contour in contours:
area = cv2.contourArea(contour)
length = cv2.arcLength(contour, True)
if area > 120 and area < 700:
if length > 88 and length < 200:
rect = cv2.boundingRect(contour)
cv2.rectangle(source, rect, (0, 0, 255), 1, 8, 0);
- 在这里参考了大佬的博客:opencv——轮廓发现与轮廓(二值图像)分析
- 查找轮廓这里返回的是所有轮廓和轮廓之间的关系
- 分析轮廓的面积和长度都是常规操作,只不过是放在for循环中
- 画外接矩形的时候,先boundingRect找到外接矩形的左上角坐标,宽和高
cv2.findContours 函数是OpenCV中用于在二值图像中查找轮廓的函数。其主要参数如下:
输入图像:这是必须的参数,通常是一个单通道的二值图像(即只有黑白两色的图像)。
前景对象和背景分别用非零像素和零像素表示。
轮廓检索模式:这个参数决定了如何存储和返回轮廓。常见的模式包括:
cv2.RETR_EXTERNAL:只检测最外层的轮廓。
cv2.RETR_LIST:检测所有轮廓,并将它们作为一个连续的列表返回。
cv2.RETR_TREE:检测所有轮廓,并建立一个层次结构,每个轮廓都有一个父轮廓。
轮廓近似方法:这个参数决定了如何简化轮廓。常见的方法包括:
cv2.CHAIN_APPROX_SIMPLE:只保留轮廓的端点,适用于大多数情况。
cv2.CHAIN_APPROX_SIMPLE:保留轮廓的端点和拐点,适用于需要精确轮廓的情况
cv2.boundingRect 函数的参数和返回值如下:
参数:
array:这是一个包含轮廓点的集合,通常通过cv2.findContours 函数获得。这个参数可以是二值图像中的轮廓点集合,也可以是灰度图像中的点集。
返回值:
函数返回四个值,分别是矩形的左上角坐标(x, y)以及矩形的宽(w)和高(h)。这些值表示一个最小外接矩形( minimum bounding rectangle),即用一个最小的矩形把找到的形状包起来。
总结:
openCV是没有HAOLCON好用啊,分析特征不是很直观,这会浪费一点时间
在001中,用到了以下算子:
cv2.adaptiveThreshold
cv2.findContours
cv2.contourArea
cv2.arcLength
cv2.boundingRect
cv2.rectangle