前言
目标检测:我们不仅要用算法判断图片中是不是猫还是狗, 还要在图片中标记出它的位置, 用边框或红色方框把猫狗圈起来, 这就是目标检测问题。其中“定位”的意思是判断猫狗在图片中的具体位置。
目标检测有两类任务:单一目标 ,多目标。
能力差,电气专业,又未怎么深入研究cv.
所以本文先探讨单一目标。
HOG+SVM实现行人检测
不多说,上代码
import cv2 as cv
# 读取图像
src = cv.imread("duoren.jpg")
cv.imshow("input", src)
# HOG + SVM
hog = cv.HOGDescriptor()
hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
# Detect people in the image
(rects, weights) = hog.detectMultiScale(src,winStride=(4, 4), padding=(8, 8),scale=1.25,useMeanshiftGrouping=False)
# 矩形框
for (x, y, w, h) in rects:
cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示[添加链接描述](https://blog.csdn.net/kobeyu652453/article/details/107382227)
cv.imshow("result", src)
cv.waitKey(0)
cv.destroyAllWindows()
图像定位实现
目标检测算法很复杂。
我尝试用 图像分类+对象测量 来实现单目标的图像检测。
图像分类 对象测量 不多说了,参考上面给的链接。
1读取图片并去噪
import cv2 as cv
image= cv.imread("catdog/dog/dog.77.jpg")
image=cv.resize(image,None,fx=0.5,fy=0.5)
blurred = cv.GaussianBlur(image, (5, 5), 0) # 去噪
2二值化图像
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
3绘制轮廓边缘
contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cv2.findContours()函数第一个参数是要检索的图片,必须是为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图,
参数讲解
contours,hierarchy=cv2.findContours(image,mode,method)
contours:轮廓
hierarchy:图像的拓扑信息(轮廓层次)(存储上一个轮廓,父轮廓…)
image:二值图像
mode:轮廓检索方式
method:轮廓的近似方法
4求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行。
c = sorted(contou