5 python opencv image-processing
我真的很新OpenCV
。我正在阅读一些教程和文档,以便制作我的第一个小脚本。
我有一张图片,我想detect objects
在这张图片上:路灯、垃圾桶......
我的图像看起来像:
我写了这个脚本:
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)
Run Code Online (Sandbox Code Playgroud)
但是如何用矩形显示图片结果呢?
太感谢了 !
我想对于我个人使用并向所有人推荐的目标检测,是使用 SIFT(尺度不变特征变换)或 SURF 算法,但请注意,这些算法现在已获得专利,并且不再包含在 OpenCV 3 中,但仍然可用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()
Run Code Online (Sandbox Code Playgroud)
推进基于 FLANN 的 Matcher
FLANN 代表近似最近邻的快速库。它包含一组针对大型数据集中的快速最近邻搜索和高维特征进行优化的算法。对于大型数据集,它的工作速度比 BFmatcher 更快。我们将看到基于 FLANN 的匹配器的第二个示例。
对于基于 FLANN 的匹配器,我们需要传递两个字典,指定要使用的算法、其相关参数等。第一个是 IndexParams。对于各种算法,要传递的信息在 FLANN 文档中进行了解释。作为总结,对于 SIFT、SURF 等算法。
使用 FLANN 和 SIFT 的示例代码:
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)
# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in xrange(len(matches))]
# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i]=[1,0]
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)
plt.imshow(img3,),plt.show()
Run Code Online (Sandbox Code Playgroud)
请参阅下面的结果:
但我推荐的是,使用 ORB 描述符进行强力匹配
在此示例中,我使用 ORB 和 Bruteforce 匹配器,此代码实时从相机捕获帧并计算输入帧的关键点、描述符,并将其与存储的查询图像进行比较,通过执行相同的操作,并返回匹配的关键点长度,相同可以应用于上面使用 SIFT 算法而不是 ORB 的代码。
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()
Run Code Online (Sandbox Code Playgroud)
有关此内容的更多描述性视频教程可以在这里找到, https://www.youtube.com/watch? v=ZW3nrP2OyLQ,还有一个好处是它是开源的: https://gitlab.com/josemariasoladuran/object-recognition-opencv -python.git
归档时间: |
|
查看次数: |
6267 次 |
最近记录: |