I download OpenCV (OpenCV-2.3.1-win-superpack.exe) and use it on python 2.6.
I use find_obj.pyfrom the catalog OpenCV\samples\python.
All magic, but even if I use try, except for the block, to wrap the code, if the code causes OpenCV error, it gives an error.
OpenCV error: invalid flag (parameter or structure field) (unrecognized or unsupported array type) in unknown function, file ...... \ OpenCV-2.3.1 \ modules \ core \ src \ array.cpp, line 2482
Since I can turn off the OpenCV warning message.
EDIT:
this is the code:
import numpy as np
import cv2
from functools import partial
help_message = '''SURF image match
USAGE: findobj.py [ <image1> <image2> ]
'''
FLANN_INDEX_KDTREE = 1
flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4)
def anorm(a):
return np.sqrt( anorm2(a) )
def match_bruteforce(desc1, desc2, r_threshold = 0.75):
res = []
for i in xrange(len(desc1)):
dist = anorm( desc2 - desc1[i] )
n1, n2 = dist.argsort()[:2]
r = dist[n1] / dist[n2]
if r < r_threshold:
res.append((i, n1))
return np.array(res)
def match_flann(desc1, desc2, r_threshold = 0.6):
flann = cv2.flann_Index(desc2, flann_params)
idx2, dist = flann.knnSearch(desc1, 2, params = {})
mask = dist[:,0] / dist[:,1] < r_threshold
idx1 = np.arange(len(desc1))
pairs = np.int32( zip(idx1, idx2[:,0]) )
return pairs[mask]
def draw_match(img1, img2, p1, p2, status = None, H = None):
h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]
vis = np.zeros((max(h1, h2), w1+w2), np.uint8)
vis[:h1, :w1] = img1
vis[:h2, w1:w1+w2] = img2
vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
if H is not None:
corners = np.float32([[0, 0], [w1, 0], [w1, h1], [0, h1]])
corners = np.int32( cv2.perspectiveTransform(corners.reshape(1, -1, 2), H).reshape(-1, 2) + (w1, 0) )
cv2.polylines(vis, [corners], True, (255, 255, 255))
if status is None:
status = np.ones(len(p1), np.bool_)
green = (0, 255, 0)
red = (0, 0, 255)
for (x1, y1), (x2, y2), inlier in zip(np.int32(p1), np.int32(p2), status):
col = [red, green][inlier]
if inlier:
cv2.line(vis, (x1, y1), (x2+w1, y2), col)
cv2.circle(vis, (x1, y1), 2, col, -1)
cv2.circle(vis, (x2+w1, y2), 2, col, -1)
else:
r = 2
thickness = 3
cv2.line(vis, (x1-r, y1-r), (x1+r, y1+r), col, thickness)
cv2.line(vis, (x1-r, y1+r), (x1+r, y1-r), col, thickness)
cv2.line(vis, (x2+w1-r, y2-r), (x2+w1+r, y2+r), col, thickness)
cv2.line(vis, (x2+w1-r, y2+r), (x2+w1+r, y2-r), col, thickness)
return vis
def search(fn1, fn2):
try:
img1 = cv2.imread(fn1, 0)
img2 = cv2.imread(fn2, 0)
surf = cv2.SURF(1000)
kp1, desc1 = surf.detect(img1, None, False)
kp2, desc2 = surf.detect(img2, None, False)
desc1.shape = (-1, surf.descriptorSize())
desc2.shape = (-1, surf.descriptorSize())
def match_and_draw(match, r_threshold):
try:
m = match(desc1, desc2, r_threshold)
matched_p1 = np.array([kp1[i].pt for i, j in m])
matched_p2 = np.array([kp2[j].pt for i, j in m])
H, status = cv2.findHomography(matched_p1, matched_p2, cv2.RANSAC, 5.0)
vis = draw_match(img1, img2, matched_p1, matched_p2, status, H)
return vis
except:
pass
vis_brute = match_and_draw( match_bruteforce, .9 )
if vis_brute != None:
cv2.imshow('find_obj SURF', vis_brute)
return True
else:
return False
except:
return False
print search('obj.png', 'pass.png')
print search('obj.png', 'fail.png')
it searches for the image (obj.png) in the larger image if the search success is ok, but if it fails, it always prints an error.
EDIT2
This is a dll list
C:\Python26\Lib\site-packages>dir opencv*
Volume in drive C has no label.
Volume Serial Number is BE63-8A7C
Directory of C:\Python26\Lib\site-packages
08/17/2011 08:27 AM 743,936 opencv_calib3d231.dll
08/17/2011 08:27 AM 547,328 opencv_contrib231.dll
08/17/2011 08:26 AM 6,595,072 opencv_core231.dll
08/17/2011 08:27 AM 878,080 opencv_features2d231.dll
08/17/2011 08:28 AM 7,417,192 opencv_ffmpeg.dll
08/17/2011 08:26 AM 395,264 opencv_flann231.dll
08/17/2011 08:27 AM 221,184 opencv_gpu231.dll
08/17/2011 08:27 AM 891,904 opencv_highgui231.dll
08/17/2011 08:26 AM 1,648,128 opencv_imgproc231.dll
08/17/2011 08:27 AM 761,856 opencv_legacy231.dll
08/17/2011 08:26 AM 451,584 opencv_ml231.dll
08/17/2011 08:27 AM 903,168 opencv_objdetect231.dll
08/17/2011 08:51 AM 335 opencv_python-2.3.1-py2.6.egg-info
08/17/2011 08:26 AM 566,272 opencv_ts231.dll
08/17/2011 08:27 AM 288,768 opencv_video231.dll
15 File(s) 22,310,071 bytes
0 Dir(s) 37,611,061,248 bytes free