使用FLANN进行特征匹配时出现OpenCV错误。

5

我有一段代码用于匹配电影片段和参考图像之间的特征。它通常工作得很好,但有时会在片段中间抛出错误。由于它总是在相同的片段,并且在相同的时间发生,我猜测它尝试分析的帧存在问题。

我的代码:

 cap = cv2.VideoCapture(clip_file)
 img1 = cv2.imread(ref_image,0)

 while(cap.isOpened()):

    # read the frame and convert to gray-scale
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Initiate ORB detector
    orb = cv2.ORB_create()

    # find the keypoints and descriptors with ORB
    kp1, des1 = orb.detectAndCompute(img1,None)
    kp2, des2 = orb.detectAndCompute(gray,None)

    # FLANN parameters
    FLANN_INDEX_LSH = 6
    index_params= dict(algorithm = FLANN_INDEX_LSH,
                table_number = 6, # 12
                key_size = 12,     # 20
                multi_probe_level = 1) #2
    search_params = dict(checks=50)   # or pass empty dictionary

    flann = cv2.FlannBasedMatcher(index_params,search_params)

    matches = flann.knnMatch(des1,des2,k=2)
    cv2.imshow('img3',frame)

它在剪辑播放过程中有时会抛出错误:
Traceback (most recent call last):
 File "movie_test.py", line 81, in <module>
flann_movie('data/movie.avi','data/ref.jpg')
 File "movie_test.py", line 35, in flann_movie
matches = flann.knnMatch(des1,des2,k=1)
 cv2.error: OpenCV(3.4.2) C:\projects\opencv- 
  python\opencv\modules\flann\src\miniflann.cpp:317: error: (-5:Bad 
   argument) Only continuous arrays are supported in function 
   'cv::flann::buildIndex_'

欢迎提供关于错误原因的任何建议,感谢您的帮助。

2个回答

1
你有以下内容:
matches = flann.knnMatch(des1,des2,k=2)

k=2时,表示每个元素需要有两个最近邻。因此,每个描述符列表都需要有超过两个元素:

if(des1 is not None and len(des1)>2 and des2 is not None and len(des2)>2):
   matches = flann.knnMatch(des1,des2,k=2)

(最近邻算法)


1
我认为错误是由视频帧引起的,其中没有检测到原始特征模板的痕迹。检查每个帧的匹配中间结果,如果这是原因,则更改FLANN的参数或在错误发生之前跳过这些帧。

谢谢,我刚刚使用以下代码跳过了帧:`try: matches = flann.knnMatch(des1,des2,k=2) except: continue',现在视频可以正常播放到结尾了。 - Pixeluz
在匹配两个图像之间的orb特征时,我遇到了同样的问题。我不想使用异常处理。当你说“没有检测到原始特征模板的痕迹”是什么意思?此外,我们如何检查匹配的中间结果? - yeshu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接