前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >目标物检测

目标物检测

作者头像
叶子陪你玩
发布2022-02-08 18:37:34
3410
发布2022-02-08 18:37:34
举报
文章被收录于专栏:叶子陪你玩编程

上篇文章分享了一个学习的网站,分享一个计算机视觉-深度学习的网站-强烈推荐,有位同学学习了里面的物体计数的内容。

学完后,换成其它图片测试,发现不行。

比如下面这种。

之所以出现这种问题,是因为目标物和背景不能很好的区分开。

一般图像预处理,都会有以下一些过程:

转换成灰度图。

检测物体边缘

阈值处理

纯色背景一般到这里就可以了,目标物和背景以及能够很好的区分出来了。

最后通过查找物体的轮廓数量,计算出对应的物体数量。

不过上面另外一张图片,背景并不是均匀的,要想很好的区分开就比较难,就算通过HSV区分后,依然还存在一些小的噪声数据。

这时需要经过一轮膨胀和腐蚀操作,就可以去除了。

完整代码:

代码语言:javascript
复制
import cv2
import numpy as np

img = cv2.imread('card1.jpg')
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower = np.array([12,0,162])
upper = np.array([179,255,255])
# 获得指定颜色范围内的掩码
mask = cv2.inRange(imgHSV,lower,upper)
# 对原图图像进行按位与的操作,掩码区域保留
imgResult = cv2.bitwise_and(img,img,mask=mask)
# 膨胀和腐蚀
mask = cv2.dilate(mask, None, iterations=1)
mask = cv2.erode(mask, None, iterations=1)
# 检测边缘
edges = cv2.Canny(mask, 30, 70)
# 查找轮廓
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
output = img.copy()
# 画出轮廓线
for c in cnts:
    cv2.drawContours(output, [c], -1, (240, 0, 159), 3)
    cv2.imshow("Contours", output)

cv2.imshow('edges', edges)
cv2.imshow("Mask", mask)

cv2.waitKey(0)
不通过机器学习,只凭借传统的图像处理方法做到物体识别,就需要对图像处理的这些基础操作非常熟练,对图片进行各种预处理,得到比较单纯的背景图片,便于区分出前景与后景。

两年前我写过如何利用python识别验证码和车牌号?(当时测试付费功能,后面的内容我下次重新更新一下),当时用的OCR软件识别的,不过图片复杂一点就不行,需要预处理好才可以。限于当时技术水平,没能用好的方法实现,各种图片处理觉得好麻烦。

今天重新看,我觉得我应该可以很好的实现了。就通过以上的方法得到字母和数字,识别需要训练一个模型或者找到大量的数字和字母图片,并打上标签,一一匹配,查找匹配度最高的即可。

当然了,现在有很多现成的机器学习库,掌握流程后,套个模板还是比较简单的,下面是如何识别数字的。

代码语言:javascript
复制
# 导入图片库
import matplotlib.pyplot as plt
import cv2
# 导入数据集,分类器,数据分割方法
from sklearn import datasets, svm
from sklearn.model_selection import train_test_split
import numpy as np
# 加载数据集
digits = datasets.load_digits()
# 将8*8的数据,变成64*1
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))

# 创建分类器
clf = svm.SVC(gamma=0.001)

# 分割数据集,训练数据和测试数据各50%
X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False
)
# print(X_test)
# 训练模型
clf.fit(X_train, y_train)

# 预测测试集
print(X_test[:1])
predicted = clf.predict(X_test[:1])

print(predicted[:4])

# 预测一张新图片
img = cv2.imread('1.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img[img>0]=255
img = cv2.resize(img,(8,8))
data = img.reshape(64,)
r= clf.predict(data)
print(r)

今日问题: 找出图片的边缘(不能借助现成的算法。)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档