网站首页 > 教程文章 正文
1.思路讲解
我们基于简单的opencv的阈值分割,通过这个阈值分割,我们能把我们需要识别的物体在二值图里面变成白色,其余的变成黑色。然后对我们分割出来的物体部分提取轮廓,算出覆盖轮廓的最小矩形,然后画出这个矩形框,并且表上我们物体的名字。
2.样本展示
小编就以这两张图片为例子,提取这两张图片里面的橙子。按照我们上面的思路,我们需要的是把橙子这个部分分割出来变成变成二值图的白色部分,其他部分变成黑色。
3.代码实现
首先我们读入一张橙子的图片,因为opencv默认读入的图片是bgr的形式,我们用的是hsv的颜色阈值,因此我们要将图片转换到hsv。然后经过一个中值滤波去除噪声,再经过一个开运算。
image=cv2.imread("c4.jpeg")
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hsv = cv2.medianBlur(hsv, 5)
mask = cv2.inRange(hsv, (11, 43, 46), (25, 255, 255))
line = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15), (-1, -1))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, line)
其中cv2.inRange会将图片中hsv值在(11, 43, 46),和(25, 255, 255)中间的值变成白色,不在中间的值变成黑色。
最后咱们处理好的二值图如下:
然后就是提取轮廓,求出最大轮廓,这个最大轮廓也就是我们的橙子
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
index = -1
max = 0
font = cv2.FONT_HERSHEY_SIMPLEX
for c in range(len(contours)):
area = cv2.contourArea(contours[c])
if area > max:
max = area
index = c
随后就是对这个橙子的轮廓求外接矩形,然后把这个矩形画出来,并且再对应的位置上标上orange。
if index >= 0:
x, y, w, h = cv2.boundingRect(contours[index])
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image,"orange",(x, y), font, 1.2, (0, 0, 255), 2)
最后的结果图片如下:
4.总结
完整的代码如下:
import cv2
def process(image):
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hsv = cv2.medianBlur(hsv, 5)
mask = cv2.inRange(hsv, (11, 43, 46), (25, 255, 255))
line = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5), (-1, -1))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, line)
cv2.imshow("mask",mask)
# 轮廓提取, 发现最大轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
index = -1
max = 0
font = cv2.FONT_HERSHEY_SIMPLEX
for c in range(len(contours)):
area = cv2.contourArea(contours[c])
if area > max:
max = area
index = c
# 绘制
if index >= 0:
x, y, w, h = cv2.boundingRect(contours[index])
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image,"orange",(x, y), font, 1.2, (0, 0, 255), 2)
return image
image=cv2.imread("c1.jpeg")
result = process(image)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
上面的代码是在图片中寻找图片中最大面积的橘子,下面我们设定一个面积阈值,只要大于这个阈值就是我们需要识别的目标,代码如下:
import cv2
def process(image):
#面积阈值
min_area=100
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hsv = cv2.medianBlur(hsv, 5)
mask = cv2.inRange(hsv, (11, 43, 46), (25, 255, 255))
line = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5), (-1, -1))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, line)
cv2.imshow("mask",mask)
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
font = cv2.FONT_HERSHEY_SIMPLEX
for c in range(len(contours)):
area = cv2.contourArea(contours[c])
if area > min_area:
# 绘制
x, y, w, h = cv2.boundingRect(contours[c])
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image,"orange",(x, y), font, 1.2, (0, 0, 255), 2)
return image
image=cv2.imread("c1.jpeg")
result = process(image)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下:
5.扩展
当然只要能通过调试cv2.inRange的参数以提取好的二值图,不止是橙子,也可以用于其他物品的识别,也可以用于颜色识别。
6.缺点
当图片里有其他在参数范围内的比我们目标更大的物体的时候干扰就会很大,导致识别错误,扩展到其他物体上的时候还可能会遇到参数难调的情况,因此在识别场景比较复杂和识别类别比较多的时候还是建议用深度学习。
猜你喜欢
- 2025-04-30 Ai机器视觉之口罩检测(口罩视觉检测方案)
- 2025-04-30 C#WinForm调用Yolov8Net实现自动识别
- 2025-04-30 探索Python中的人脸识别:深入pyfacelib库
- 2025-04-30 Pytorch利用CNN卷积神经网络进行多数字(0-9)识别
- 2025-04-30 【AI&ML】如何使用Google Colaboratory进行视频处理
- 2025-04-30 自动识别影视场景中的演员(自动识别电影)
- 2025-04-30 Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别
- 2025-04-30 使用Python和YOLO检测车牌(python判断车牌号归属地)
- 2025-04-30 用python给图片批量打水印(python批量去水印)
- 2025-04-30 简单易懂的人脸识别!用PythonOpenCV实现(适合初学者)!附源码
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)