使用OpenCV Python检测对象
我对使用OpenCV Python检测对象,python,opencv,image-processing,Python,Opencv,Image Processing,我对OpenCV非常陌生。为了编写我的第一个小脚本,我正在阅读一些教程和文档 我有一张图像,我想在这张图像上检测物体:路灯、垃圾桶 我的图像看起来像: import cv2 img_filt = cv2.medianBlur(cv2.imread('ville.jpg',0), 5) img_th = cv2.adaptiveThreshold(img_filt,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) img_fil
OpenCV
非常陌生。为了编写我的第一个小脚本,我正在阅读一些教程和文档
我有一张图像,我想在这张图像上检测物体:路灯、垃圾桶
我的图像看起来像:
import cv2
img_filt = cv2.medianBlur(cv2.imread('ville.jpg',0), 5)
img_th = cv2.adaptiveThreshold(img_filt,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
img_filt, contours, hierarchy = cv2.findContours(img_th, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
display = cv2.imshow("Objects",img_filt)
wait_time = cv2.waitKey(0)
我写了这个脚本:
import cv2
img_filt = cv2.medianBlur(cv2.imread('ville.jpg',0), 5)
img_th = cv2.adaptiveThreshold(img_filt,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
img_filt, contours, hierarchy = cv2.findContours(img_th, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
display = cv2.imshow("Objects",img_filt)
wait_time = cv2.waitKey(0)
但是如何用矩形显示图片结果呢
非常感谢你 我发布了代码作为答案,但它只显示过滤器检索到的轮廓。如果你的图像是黑白的,而不是超复杂的,那么这种类型的过滤器很适合轮廓检索。否则我想你要找的是物体周围的边界框。这需要比一些过滤器多一点 我还添加了matplotlib显示,因为这是您最初要求的,但正如您所能做的那样,它不是很有用
import cv2
import matplotlib.pyplot as plt
img_orig = cv2.imread('ville.jpg',0)
img_filt = cv2.medianBlur(img_orig, 5)
img_th = cv2.adaptiveThreshold(img_filt,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
contours, hierarchy = cv2.findContours(img_th, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
plt.imshow(img_orig)
cv2.drawContours(img_orig,contours,-1,(128,255,0),1)
display = cv2.imshow("Objects",img_orig)
wait_time = cv2.waitKey(0)
cv2.destroyAllWindows()
其他有用链接:
稍后编辑一些有用的文献,可以帮助您开始高级对象检测,您可以在此处找到:
注:这更多的是指有意义的对象检测,而不仅仅是检测描述形状的简单轮廓。我个人使用并向所有人推荐的对象检测,是通过使用SIFT(尺度不变特征变换)或SURF算法,但请注意,这些算法现在已获得专利,并且不再包含在OpenCV3中,仍然可以在openCV2中使用,作为很好的替代方案,我更喜欢使用ORB,它是SIFT/SURF的开源实现 使用SIFT描述符和比率测试的蛮力匹配 这里我们使用BFMatcher.knnMatch()获得k个最佳匹配。在这个例子中,我们将取k=2,这样我们可以应用D.Lowe在论文中解释的比率测试
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('box.png',0) # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# Apply ratio test
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
plt.imshow(img3),plt.show()
更多关于这方面的描述性视频教程将在这里找到,
还有一件好事是
它是开源的:
您希望检测哪些对象?请澄清您可以使用模板匹配来检测相同大小和方向的对象。这是@nithin是的,很抱歉我第一次使用OpenCV。目标是检测路灯、垃圾桶。。在照片上。我真的没有找到一个很好的教程来做这件事。你需要画轮廓才能看到它们:
cv2.drawcourts(img\u filt,courts,-1,(128255,0),1)
。虽然我会将它们显示在原始图像上,而不是过滤后的图像上。@VijayKalmath谢谢!但它只有在我有图像数据库的情况下才能工作,对吗?我非常理解你的脚本谢谢!我尝试了一下,但做了一些修改,但我得到了以下错误:Traceback(最后一次调用):文件“image.py”,第17行,在等高线中,hierarchy=cv2.findContours(img_th,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)ValueError:value太多,无法解压缩
您使用的是哪一个版本的Python?尝试使用3个参数调用它,如初始示例中所示。e、 g:image,contours,hierarchy=cv2…
在我的Python 2.7中,我只能使用cv2.findContours
和两个参数contours,hierarchy=cv2.findContours()
@Andro使用它来克服这个错误contours,hierarchy=cv2.findContours(thresh,cv2.RETR\u TREE,cv2.CHAIN\u近似简单)[-2:]
奇怪,因为我使用的是与您相同的版本。我会尝试一些事情,如果得到解决方案,我会返回结果;)谢谢你很长的回答。这对我来说有点困难,因为我对这类库非常陌生。在我的回答中,我使用标准的CV算法,以便在给定的输入图像/帧中找到最佳的一般Mathich关键点,并将其与我们想要比较的图像进行比较,只需找到一些我们已经拥有的对象,并将输入的img与存储的img进行比较,因此在这种情况下,我们只需要已知的在给定i/p图像中可以找到的最大匹配关键点数量。查看此视频:它是开源sa,所以从这里克隆它,git clone,确保在opencv3中运行此功能,我猜这正是您要寻找的@是的,这正是我正在搜索的内容,只有一个区别:我没有一个视频作为起始点,而是一张图片。所以我想用图片更容易些?我会仔细看看你的答案;)是的,您可以修改代码,以便仅比较图片!,从网络摄像头获取的代码流,并与摄像头帧进行比较,而不是与您正在寻找的隐形图片进行比较。
import numpy as np
import cv2
from imutils.video import WebcamVideoStream
from imutils.video import FPS
MIN_MATCH_COUNT = 10
img1 = cv2.imread('input_query.jpg', 0)
orb = cv2.ORB()
kp1, des1 = orb.detectAndCompute(img1, None)
webcam = WebcamVideoStream(src=0).start()
fps = FPS().start()
while True:
img2 = webcam.read()
key = cv2.waitKey(10)
cv2.imshow('',img2)
if key == 1048603:
break
kp2, des2 = orb.detectAndCompute(img2, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance) # compute the descriptors with ORB
if not len(matches) > MIN_MATCH_COUNT:
print "Not enough matches are found - %d/%d" % (len(matches), MIN_MATCH_COUNT)
matchesMask = None
#simg2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA)
print len(matches)
#img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2)
fps.update()
fps.stop()