Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenCV Python检测对象_Python_Opencv_Image Processing - Fatal编程技术网

使用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()