21 class OpenCVTests(unittest.TestCase):
23 depths = [ cv.IPL_DEPTH_8U, cv.IPL_DEPTH_8S, cv.IPL_DEPTH_16U, cv.IPL_DEPTH_16S, cv.IPL_DEPTH_32S, cv.IPL_DEPTH_32F, cv.IPL_DEPTH_64F ]
65 def depthsize(self, d):
66 return { cv.IPL_DEPTH_8U : 1,
72 cv.IPL_DEPTH_64F : 8 }[d]
74 def get_sample(self, filename, iscolor = cv.CV_LOAD_IMAGE_COLOR):
75 if not filename in self.image_cache:
76 filedata = urllib.urlopen("https://raw.github.com/Itseez/opencv/master/" + filename).read()
77 imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1)
78 cv.SetData(imagefiledata, filedata, len(filedata))
79 self.image_cache[filename] = cv.DecodeImageM(imagefiledata, iscolor)
80 return self.image_cache[filename]
89 for i,img in enumerate(L):
90 cv.NamedWindow("snap-%d" % i, 1)
91 cv.ShowImage("snap-%d" % i, img)
93 cv.DestroyAllWindows()
95 def hashimg(self, im):
96 """ Compute a hash for an image, useful for image comparisons """
97 return hashlib.md5(im.tostring()).digest()
99 # Tests to run first; check the handful of basic operations that the later tests rely on
101 class PreliminaryTests(OpenCVTests):
104 # Check that the lena jpg image has loaded correctly
105 # This test uses a 'golden' MD5 hash of the Lena image
106 # If the JPEG decompressor changes, it is possible that the MD5 hash will change,
107 # so the hash here will need to change.
109 im = self.get_sample("samples/c/lena.jpg")
110 # self.snap(im) # uncomment this line to view the image, when regilding
111 self.assertEqual(hashlib.md5(im.tostring()).hexdigest(), "9dcd9247f9811c6ce86675ba7b0297b6")
113 def test_LoadImage(self):
114 self.assertRaises(TypeError, lambda: cv.LoadImage())
115 self.assertRaises(TypeError, lambda: cv.LoadImage(4))
116 self.assertRaises(TypeError, lambda: cv.LoadImage('foo.jpg', 1, 1))
117 self.assertRaises(TypeError, lambda: cv.LoadImage('foo.jpg', xiscolor=cv.CV_LOAD_IMAGE_COLOR))
119 def test_types(self):
120 self.assert_(type(cv.CreateImage((7,5), cv.IPL_DEPTH_8U, 1)) == cv.iplimage)
121 self.assert_(type(cv.CreateMat(5, 7, cv.CV_32FC1)) == cv.cvmat)
122 for i,t in enumerate(self.mat_types):
132 self.assertEqual(basefunc(1 + (i % 4)), t)
134 def test_tostring(self):
136 for w in [ 1, 4, 64, 512, 640]:
137 for h in [ 1, 4, 64, 480, 512]:
138 for c in [1, 2, 3, 4]:
139 for d in self.depths:
140 a = cv.CreateImage((w,h), d, c);
141 self.assert_(len(a.tostring()) == w * h * c * self.depthsize(d))
143 for w in [ 32, 96, 480 ]:
144 for h in [ 32, 96, 480 ]:
148 cv.IPL_DEPTH_16U : 2,
149 cv.IPL_DEPTH_16S : 2,
150 cv.IPL_DEPTH_32S : 4,
151 cv.IPL_DEPTH_32F : 4,
154 for f in self.depths:
155 for channels in (1,2,3,4):
156 img = cv.CreateImage((w, h), f, channels)
157 esize = (w * h * channels * depth_size[f])
158 self.assert_(len(img.tostring()) == esize)
159 cv.SetData(img, " " * esize, w * channels * depth_size[f])
160 self.assert_(len(img.tostring()) == esize)
193 for t in self.mat_types:
194 for im in [cv.CreateMat(h, w, t), cv.CreateMatND([h, w], t)]:
195 elemsize = cv.CV_MAT_CN(cv.GetElemType(im)) * mattype_size[cv.GetElemType(im)]
196 cv.SetData(im, " " * (w * h * elemsize), (w * elemsize))
197 esize = (w * h * elemsize)
198 self.assert_(len(im.tostring()) == esize)
199 cv.SetData(im, " " * esize, w * elemsize)
200 self.assert_(len(im.tostring()) == esize)
202 # Tests for specific OpenCV functions
204 class FunctionTests(OpenCVTests):
206 def test_AvgSdv(self):
207 m = cv.CreateMat(1, 8, cv.CV_32FC1)
208 for i,v in enumerate([2, 4, 4, 4, 5, 5, 7, 9]):
210 self.assertAlmostEqual(cv.Avg(m)[0], 5.0, 3)
211 avg,sdv = cv.AvgSdv(m)
212 self.assertAlmostEqual(avg[0], 5.0, 3)
213 self.assertAlmostEqual(sdv[0], 2.0, 3)
215 def test_CalcEMD2(self):
217 for r in [ 5, 10, 37, 38 ]:
218 scratch = cv.CreateImage((100,100), 8, 1)
220 cv.Circle(scratch, (50,50), r, 255, -1)
221 storage = cv.CreateMemStorage()
222 seq = cv.FindContours(scratch, storage, cv.CV_RETR_TREE, cv.CV_CHAIN_APPROX_SIMPLE)
223 arr = cv.CreateMat(len(seq), 3, cv.CV_32FC1)
224 for i,e in enumerate(seq):
230 return abs(A[0]-B[0]) + abs(A[1]-B[1])
232 return math.sqrt((A[0]-B[0])**2 + (A[1]-B[1])**2)
234 return max(abs(A[0]-B[0]), abs(A[1]-B[1]))
235 contours = set(cc.values())
238 self.assert_(abs(cv.CalcEMD2(c0, c1, cv.CV_DIST_L1) - cv.CalcEMD2(c0, c1, cv.CV_DIST_USER, myL1)) < 1e-3)
239 self.assert_(abs(cv.CalcEMD2(c0, c1, cv.CV_DIST_L2) - cv.CalcEMD2(c0, c1, cv.CV_DIST_USER, myL2)) < 1e-3)
240 self.assert_(abs(cv.CalcEMD2(c0, c1, cv.CV_DIST_C) - cv.CalcEMD2(c0, c1, cv.CV_DIST_USER, myC)) < 1e-3)
242 def test_CalcOpticalFlowBM(self):
243 a = self.get_sample("samples/c/lena.jpg", 0)
244 b = self.get_sample("samples/c/lena.jpg", 0)
245 (w,h) = cv.GetSize(a)
246 vel_size = (w - 8 + 1, h - 8 + 1)
247 velx = cv.CreateImage(vel_size, cv.IPL_DEPTH_32F, 1)
248 vely = cv.CreateImage(vel_size, cv.IPL_DEPTH_32F, 1)
249 cv.CalcOpticalFlowBM(a, b, (8,8), (1,1), (8,8), 0, velx, vely)
251 def test_CalcOpticalFlowPyrLK(self):
252 a = self.get_sample("samples/c/lena.jpg", 0)
253 map = cv.CreateMat(2, 3, cv.CV_32FC1)
254 cv.GetRotationMatrix2D((256, 256), 10, 1.0, map)
256 cv.WarpAffine(a, b, map)
258 eig_image = cv.CreateMat(a.rows, a.cols, cv.CV_32FC1)
259 temp_image = cv.CreateMat(a.rows, a.cols, cv.CV_32FC1)
261 prevPyr = cv.CreateMat(a.rows / 3, a.cols + 8, cv.CV_8UC1)
262 currPyr = cv.CreateMat(a.rows / 3, a.cols + 8, cv.CV_8UC1)
263 prevFeatures = cv.GoodFeaturesToTrack(a, eig_image, temp_image, 400, 0.01, 0.01)
264 (currFeatures, status, track_error) = cv.CalcOpticalFlowPyrLK(a,
271 (cv.CV_TERMCRIT_ITER|cv.CV_TERMCRIT_EPS,20, 0.03),
273 if 0: # enable visualization
275 print sum(status), "Points found in curr image"
276 for prev,this in zip(prevFeatures, currFeatures):
277 iprev = tuple([int(c) for c in prev])
278 ithis = tuple([int(c) for c in this])
279 cv.Circle(a, iprev, 3, 255)
280 cv.Circle(a, ithis, 3, 0)
281 cv.Line(a, iprev, ithis, 128)
285 def test_CartToPolar(self):
286 x = cv.CreateMat(5, 5, cv.CV_32F)
287 y = cv.CreateMat(5, 5, cv.CV_32F)
288 mag = cv.CreateMat(5, 5, cv.CV_32F)
289 angle = cv.CreateMat(5, 5, cv.CV_32F)
290 x2 = cv.CreateMat(5, 5, cv.CV_32F)
291 y2 = cv.CreateMat(5, 5, cv.CV_32F)
298 for in_degrees in [False, True]:
299 cv.CartToPolar(x, y, mag, angle, in_degrees)
300 cv.PolarToCart(mag, angle, x2, y2, in_degrees)
303 self.assertAlmostEqual(x[i, j], x2[i, j], 1)
304 self.assertAlmostEqual(y[i, j], y2[i, j], 1)
306 def test_Circle(self):
307 for w,h in [(2,77), (77,2), (256, 256), (640,480)]:
308 img = cv.CreateImage((w,h), cv.IPL_DEPTH_8U, 1)
310 tricky = [ -8000, -2, -1, 0, 1, h/2, h-1, h, h+1, w/2, w-1, w, w+1, 8000]
313 for r in [ 0, 1, 2, 3, 4, 5, w/2, w-1, w, w+1, h/2, h-1, h, h+1, 8000 ]:
314 for thick in [1, 2, 10]:
315 for t in [0, 8, 4, cv.CV_AA]:
316 cv.Circle(img, (x0,y0), r, 255, thick, t)
317 # just check that something was drawn
318 self.assert_(cv.Sum(img)[0] > 0)
320 def test_ConvertImage(self):
321 i1 = cv.GetImage(self.get_sample("samples/c/lena.jpg", 1))
322 i2 = cv.CloneImage(i1)
323 i3 = cv.CloneImage(i1)
324 cv.ConvertImage(i1, i2, cv.CV_CVTIMG_FLIP + cv.CV_CVTIMG_SWAP_RB)
325 self.assertNotEqual(self.hashimg(i1), self.hashimg(i2))
326 cv.ConvertImage(i2, i3, cv.CV_CVTIMG_FLIP + cv.CV_CVTIMG_SWAP_RB)
327 self.assertEqual(self.hashimg(i1), self.hashimg(i3))
329 def test_ConvexHull2(self):
330 # Draw a series of N-pointed stars, find contours, assert the contour is not convex,
331 # assert the hull has N segments, assert that there are N convexity defects.
334 return (int(400 + r * math.cos(th)), int(400 + r * math.sin(th)))
335 storage = cv.CreateMemStorage(0)
336 for way in ['CvSeq', 'CvMat', 'list']:
337 for points in range(3,20):
338 scratch = cv.CreateImage((800,800), 8, 1)
341 cv.FillPoly(scratch, [ [ polar2xy(i * 2 * math.pi / sides, [100,350][i&1]) for i in range(sides) ] ], 255)
343 seq = cv.FindContours(scratch, storage, cv.CV_RETR_TREE, cv.CV_CHAIN_APPROX_SIMPLE)
350 arr = cv.CreateMat(len(seq), 1, cv.CV_32SC2)
351 for i,e in enumerate(seq):
355 # pts is a list of 2-tuples
360 self.assert_(cv.CheckContourConvexity(pts) == 0)
361 hull = cv.ConvexHull2(pts, storage, return_points = 1)
362 self.assert_(cv.CheckContourConvexity(hull) == 1)
363 self.assert_(len(hull) == points)
365 if way in [ 'CvSeq', 'CvMat' ]:
366 defects = cv.ConvexityDefects(pts, cv.ConvexHull2(pts, storage), storage)
367 self.assert_(len([depth for (_,_,_,depth) in defects if (depth > 5)]) == points)
369 def test_CreateImage(self):
370 for w in [ 1, 4, 64, 512, 640]:
371 for h in [ 1, 4, 64, 480, 512]:
372 for c in [1, 2, 3, 4]:
373 for d in self.depths:
374 a = cv.CreateImage((w,h), d, c);
375 self.assert_(a.width == w)
376 self.assert_(a.height == h)
377 self.assert_(a.nChannels == c)
378 self.assert_(a.depth == d)
379 self.assert_(cv.GetSize(a) == (w, h))
380 # self.assert_(cv.GetElemType(a) == d)
381 self.assertRaises(cv.error, lambda: cv.CreateImage((100, 100), 9, 1))
383 def test_CreateMat(self):
384 for rows in [1, 2, 4, 16, 64, 512, 640]:
385 for cols in [1, 2, 4, 16, 64, 512, 640]:
386 for t in self.mat_types:
387 m = cv.CreateMat(rows, cols, t)
388 self.assertEqual(cv.GetElemType(m), t)
389 self.assertEqual(m.type, t)
390 self.assertRaises(cv.error, lambda: cv.CreateMat(-1, 100, cv.CV_8SC4))
391 self.assertRaises(cv.error, lambda: cv.CreateMat(100, -1, cv.CV_8SC4))
392 self.assertRaises(cv.error, lambda: cv.cvmat())
394 def test_DrawChessboardCorners(self):
395 im = cv.CreateImage((512,512), cv.IPL_DEPTH_8U, 3)
397 cv.DrawChessboardCorners(im, (5, 5), [ ((i/5)*100+50,(i%5)*100+50) for i in range(5 * 5) ], 1)
399 def test_ExtractSURF(self):
400 img = self.get_sample("samples/c/lena.jpg", 0)
401 w,h = cv.GetSize(img)
402 for hessthresh in [ 300,400,500]:
404 for layers in [1,3,10]:
405 kp,desc = cv.ExtractSURF(img, None, cv.CreateMemStorage(), (dsize, hessthresh, 3, layers))
406 self.assert_(len(kp) == len(desc))
408 self.assert_(len(d) == {0:64, 1:128}[dsize])
409 for pt,laplacian,size,dir,hessian in kp:
410 self.assert_((0 <= pt[0]) and (pt[0] <= w))
411 self.assert_((0 <= pt[1]) and (pt[1] <= h))
412 self.assert_(laplacian in [-1, 0, 1])
413 self.assert_((0 <= dir) and (dir <= 360))
414 self.assert_(hessian >= hessthresh)
416 def test_FillPoly(self):
417 scribble = cv.CreateImage((640,480), cv.IPL_DEPTH_8U, 1)
421 self.assert_(cv.CountNonZero(scribble) == 0)
422 cv.FillPoly(scribble, [ [ (random.randrange(640), random.randrange(480)) for i in range(100) ] ], (255,))
423 self.assert_(cv.CountNonZero(scribble) != 0)
425 def test_FindChessboardCorners(self):
426 im = cv.CreateImage((512,512), cv.IPL_DEPTH_8U, 1)
430 status,corners = cv.FindChessboardCorners( im, (7,7) )
432 # Perfect checkerboard
434 return ((96 + o) + 40 * i, (96 + o) + 40 * j)
437 color = ((i ^ j) & 1) * 255
438 cv.Rectangle(im, xf(i,j, 0), xf(i,j, 39), color, cv.CV_FILLED)
439 status,corners = cv.FindChessboardCorners( im, (7,7) )
441 self.assert_(len(corners) == (7 * 7))
443 # Exercise corner display
444 im3 = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3)
445 cv.Merge(im, im, im, None, im3)
446 cv.DrawChessboardCorners(im3, (7,7), corners, status)
451 # Run it with too many corners
455 color = ((i ^ j) & 1) * 255
458 cv.Rectangle(im, (x, y), (x+4, y+4), color, cv.CV_FILLED)
459 status,corners = cv.FindChessboardCorners( im, (7,7) )
461 # XXX - this is very slow
464 cv.RandArr(rng, im, cv.CV_RAND_UNI, 0, 255.0)
466 status,corners = cv.FindChessboardCorners( im, (7,7) )
468 def test_FindContours(self):
471 storage = cv.CreateMemStorage()
473 # First run FindContours on a black image.
474 for mode in [cv.CV_RETR_EXTERNAL, cv.CV_RETR_LIST, cv.CV_RETR_CCOMP, cv.CV_RETR_TREE]:
475 for method in [cv.CV_CHAIN_CODE, cv.CV_CHAIN_APPROX_NONE, cv.CV_CHAIN_APPROX_SIMPLE, cv.CV_CHAIN_APPROX_TC89_L1, cv.CV_CHAIN_APPROX_TC89_KCOS, cv.CV_LINK_RUNS]:
476 scratch = cv.CreateImage((800,800), 8, 1)
478 seq = cv.FindContours(scratch, storage, mode, method)
485 for trial in range(10):
486 scratch = cv.CreateImage((800,800), 8, 1)
488 def plot(center, radius, mode):
489 cv.Circle(scratch, center, radius, mode, -1)
494 subs = random.choice([1,2,3])
496 return [ plot(center, radius - 5, newmode) ]
498 newradius = int({ 2: radius / 2, 3: radius / 2.3 }[subs] - 5)
501 for i in range(subs):
502 th = i * (2 * math.pi) / subs
503 ret.append(plot((int(center[0] + r * math.cos(th)), int(center[1] + r * math.sin(th))), newradius, newmode))
506 actual = plot((400,400), 390, 255 )
508 seq = cv.FindContours(scratch, storage, cv.CV_RETR_TREE, cv.CV_CHAIN_APPROX_SIMPLE)
514 self.assert_(abs(cv.ContourArea(s)) > 0.0)
515 ((x,y),(w,h),th) = cv.MinAreaRect2(s, cv.CreateMemStorage())
516 self.assert_(((w / h) - 1.0) < 0.01)
517 self.assert_(abs(cv.ContourArea(s)) > 0.0)
520 r.append(traverse(s.v_next()))
523 self.assert_(traverse(seq.v_next()) == actual)
526 original = cv.CreateImage((800,800), 8, 1)
528 cv.Circle(original, (400, 400), 200, 255, -1)
529 cv.Circle(original, (100, 100), 20, 255, -1)
531 original = self.get_sample("samples/c/lena.jpg", 0)
532 cv.Threshold(original, original, 128, 255, cv.CV_THRESH_BINARY);
534 contours = cv.FindContours(original, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
537 def contour_iterator(contour):
540 contour = contour.h_next()
542 # Should be 2 contours from the two circles above
543 self.assertEqual(len(list(contour_iterator(contours))), 2)
546 sketch = cv.CreateImage(cv.GetSize(original), 8, 3)
548 red = cv.RGB(255, 0, 0)
549 green = cv.RGB(0, 255, 0)
550 for c in contour_iterator(contours):
551 cv.DrawContours(sketch, c, red, green, 0)
554 def test_GetAffineTransform(self):
555 mapping = cv.CreateMat(2, 3, cv.CV_32FC1)
556 cv.GetAffineTransform([ (0,0), (1,0), (0,1) ], [ (0,0), (17,0), (0,17) ], mapping)
557 self.assertAlmostEqual(mapping[0,0], 17, 2)
558 self.assertAlmostEqual(mapping[1,1], 17, 2)
560 def test_GetRotationMatrix2D(self):
561 mapping = cv.CreateMat(2, 3, cv.CV_32FC1)
562 for scale in [0.0, 1.0, 2.0]:
563 for angle in [0.0, 360.0]:
564 cv.GetRotationMatrix2D((0,0), angle, scale, mapping)
571 self.assertAlmostEqual(mapping[r, c], e, 2)
573 def test_GetSize(self):
574 self.assert_(cv.GetSize(cv.CreateMat(5, 7, cv.CV_32FC1)) == (7,5))
575 self.assert_(cv.GetSize(cv.CreateImage((7,5), cv.IPL_DEPTH_8U, 1)) == (7,5))
577 def test_GetStarKeypoints(self):
578 src = self.get_sample("samples/c/lena.jpg", 0)
579 storage = cv.CreateMemStorage()
580 kp = cv.GetStarKeypoints(src, storage)
581 self.assert_(len(kp) > 0)
582 for (x,y),scale,r in kp:
584 self.assert_(x <= cv.GetSize(src)[0])
586 self.assert_(y <= cv.GetSize(src)[1])
588 scribble = cv.CreateImage(cv.GetSize(src), 8, 3)
589 cv.CvtColor(src, scribble, cv.CV_GRAY2BGR)
590 for (x,y),scale,r in kp:
592 cv.Circle(scribble, (x,y), scale, cv.RGB(255,0,0))
595 def test_GetSubRect(self):
596 src = cv.CreateImage((100,100), 8, 1)
597 data = "z" * (100 * 100)
599 cv.SetData(src, data, 100)
600 start_count = sys.getrefcount(data)
604 for i in range(iter):
605 sub = cv.GetSubRect(src, (0, 0, 10, 10))
607 self.assert_(sys.getrefcount(data) == (start_count + iter))
609 src = self.get_sample("samples/c/lena.jpg", 0)
610 made = cv.CreateImage(cv.GetSize(src), 8, 1)
611 sub = cv.CreateMat(32, 32, cv.CV_8UC1)
612 for x in range(0, 512, 32):
613 for y in range(0, 512, 32):
614 sub = cv.GetSubRect(src, (x, y, 32, 32))
615 cv.SetImageROI(made, (x, y, 32, 32))
617 cv.ResetImageROI(made)
618 cv.AbsDiff(made, src, made)
619 self.assert_(cv.CountNonZero(made) == 0)
621 for m1 in [cv.CreateMat(1, 10, cv.CV_8UC1), cv.CreateImage((10, 1), 8, 1)]:
624 def aslist(cvmat): return list(array.array('B', cvmat.tostring()))
625 m2 = cv.GetSubRect(m1, (5, 0, 4, 1))
626 m3 = cv.GetSubRect(m2, (1, 0, 2, 1))
627 self.assertEqual(aslist(m1), range(10))
628 self.assertEqual(aslist(m2), range(5, 9))
629 self.assertEqual(aslist(m3), range(6, 8))
631 def xtest_grabCut(self):
632 image = self.get_sample("samples/c/lena.jpg", cv.CV_LOAD_IMAGE_COLOR)
633 tmp1 = cv.CreateMat(1, 13 * 5, cv.CV_32FC1)
634 tmp2 = cv.CreateMat(1, 13 * 5, cv.CV_32FC1)
635 mask = cv.CreateMat(image.rows, image.cols, cv.CV_8UC1)
636 cv.GrabCut(image, mask, (10,10,200,200), tmp1, tmp2, 10, cv.GC_INIT_WITH_RECT)
638 def test_HoughLines2_PROBABILISTIC(self):
639 li = cv.HoughLines2(self.yield_line_image(),
640 cv.CreateMemStorage(),
641 cv.CV_HOUGH_PROBABILISTIC,
647 self.assert_(len(li) > 0)
648 self.assert_(li[0] != None)
650 def test_HoughLines2_STANDARD(self):
651 li = cv.HoughLines2(self.yield_line_image(),
652 cv.CreateMemStorage(),
653 cv.CV_HOUGH_STANDARD,
659 self.assert_(len(li) > 0)
660 self.assert_(li[0] != None)
662 def test_InPaint(self):
663 src = self.get_sample("samples/cpp/building.jpg")
664 msk = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_8U, 1)
665 damaged = cv.CloneMat(src)
666 repaired = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_8U, 3)
667 difference = cv.CloneImage(repaired)
669 for method in [ cv.CV_INPAINT_NS, cv.CV_INPAINT_TELEA ]:
670 for (p0,p1) in [ ((10,10), (400,400)) ]:
671 cv.Line(damaged, p0, p1, cv.RGB(255, 0, 255), 2)
672 cv.Line(msk, p0, p1, 255, 2)
673 cv.Inpaint(damaged, msk, repaired, 10., cv.CV_INPAINT_NS)
674 cv.AbsDiff(src, repaired, difference)
675 #self.snapL([src, damaged, repaired, difference])
677 def test_InitLineIterator(self):
678 scribble = cv.CreateImage((640,480), cv.IPL_DEPTH_8U, 1)
679 self.assert_(len(list(cv.InitLineIterator(scribble, (20,10), (30,10)))) == 11)
681 def test_InRange(self):
684 Igray1 = cv.CreateImage(sz,cv.IPL_DEPTH_32F,1)
685 Ilow1 = cv.CreateImage(sz,cv.IPL_DEPTH_32F,1)
686 Ihi1 = cv.CreateImage(sz,cv.IPL_DEPTH_32F,1)
687 Igray2 = cv.CreateImage(sz,cv.IPL_DEPTH_32F,1)
688 Ilow2 = cv.CreateImage(sz,cv.IPL_DEPTH_32F,1)
689 Ihi2 = cv.CreateImage(sz,cv.IPL_DEPTH_32F,1)
691 Imask = cv.CreateImage(sz, cv.IPL_DEPTH_8U,1)
692 Imaskt = cv.CreateImage(sz,cv.IPL_DEPTH_8U,1)
694 cv.InRange(Igray1, Ilow1, Ihi1, Imask);
695 cv.InRange(Igray2, Ilow2, Ihi2, Imaskt);
697 cv.Or(Imask, Imaskt, Imask);
701 img = cv.CreateImage((w,h), cv.IPL_DEPTH_8U, 1)
703 tricky = [ -8000, -2, -1, 0, 1, h/2, h-1, h, h+1, w/2, w-1, w, w+1, 8000]
708 for thickness in [ 0, 1, 8 ]:
709 for line_type in [0, 4, 8, cv.CV_AA ]:
710 cv.Line(img, (x0,y0), (x1,y1), 255, thickness, line_type)
711 # just check that something was drawn
712 self.assert_(cv.Sum(img)[0] > 0)
714 def test_MinMaxLoc(self):
715 scribble = cv.CreateImage((640,480), cv.IPL_DEPTH_8U, 1)
716 los = [ (random.randrange(480), random.randrange(640)) for i in range(100) ]
717 his = [ (random.randrange(480), random.randrange(640)) for i in range(100) ]
718 for (lo,hi) in zip(los,his):
719 cv.Set(scribble, 128)
722 r = cv.MinMaxLoc(scribble)
723 self.assert_(r == (0, 255, tuple(reversed(lo)), tuple(reversed(hi))))
725 def xxx_test_PyrMeanShiftFiltering(self): # XXX - ticket #306
727 src = self.get_sample("samples/c/lena.jpg", cv.CV_LOAD_IMAGE_COLOR)
728 dst = cv.CloneMat(src)
729 cv.PyrMeanShiftFiltering(src, dst, 5, 5)
735 print len(r.tostring())
738 def test_Reshape(self):
743 im = cv.CreateMat( rows, cols, cv.CV_32FC1 )
744 elems = rows * cols * 1
746 return cv.GetSize(im) + (cv.CV_MAT_CN(cv.GetElemType(im)),)
748 for c in (1, 2, 3, 4):
749 nc,nr,nd = crd(cv.Reshape(im, c))
750 self.assert_(nd == c)
751 self.assert_((nc * nr * nd) == elems)
753 nc,nr,nd = crd(cv.Reshape(im, 0, 97*2))
754 self.assert_(nr == 97*2)
755 self.assert_((nc * nr * nd) == elems)
757 nc,nr,nd = crd(cv.Reshape(im, 3, 97*2))
758 self.assert_(nr == 97*2)
759 self.assert_(nd == 3)
760 self.assert_((nc * nr * nd) == elems)
762 # Now test ReshapeMatND
763 mat = cv.CreateMatND([24], cv.CV_32FC1)
765 self.assertEqual(cv.GetDims(cv.ReshapeMatND(mat, 0, [24, 1])), (24, 1))
766 self.assertEqual(cv.GetDims(cv.ReshapeMatND(mat, 0, [6, 4])), (6, 4))
767 self.assertEqual(cv.GetDims(cv.ReshapeMatND(mat, 24, [1])), (1,))
768 self.assertRaises(TypeError, lambda: cv.ReshapeMatND(mat, 12, [1]))
771 for o in [ cv.CreateImage((128,128), cv.IPL_DEPTH_8U, 1), cv.CreateMat(16, 16, cv.CV_32FC1), cv.CreateMatND([7,9,4], cv.CV_32FC1) ]:
772 cv.Save("test.save", o)
773 loaded = cv.Load("test.save", cv.CreateMemStorage())
774 self.assert_(type(o) == type(loaded))
776 def test_SetIdentity(self):
777 for r in range(1,16):
778 for c in range(1, 16):
779 for t in self.mat_types_single:
780 M = cv.CreateMat(r, c, t)
788 self.assertEqual(M[rj,cj], expected)
790 def test_SnakeImage(self):
791 src = self.get_sample("samples/c/lena.jpg", 0)
792 pts = [ (512-i,i) for i in range(0, 512, 8) ]
794 # Make sure that weight arguments get validated
795 self.assertRaises(TypeError, lambda: cv.SnakeImage(cv.GetImage(src), pts, [1,2], .01, .01, (7,7), (cv.CV_TERMCRIT_ITER, 100, 0.1)))
797 # Smoke by making sure that points are changed by call
798 r = cv.SnakeImage(cv.GetImage(src), pts, .01, .01, .01, (7,7), (cv.CV_TERMCRIT_ITER, 100, 0.1))
800 cv.PolyLine(src, [ r ], 0, 255)
802 self.assertEqual(len(r), len(pts))
803 self.assertNotEqual(r, pts)
805 # Ensure that list of weights is same as scalar weight
807 r2 = cv.SnakeImage(cv.GetImage(src), pts, w, w, w, (7,7), (cv.CV_TERMCRIT_ITER, 100, 0.1))
808 self.assertEqual(r, r2)
810 def test_KMeans2(self):
812 samples = cv.CreateMat(size, 1, cv.CV_32FC3)
813 labels = cv.CreateMat(size, 1, cv.CV_32SC1)
814 centers = cv.CreateMat(2, 3, cv.CV_32FC1)
820 cv.Set(cv.GetSubRect(samples, (0, 0, 1, size/2)), (255, 255, 255))
822 compact = cv.KMeans2(samples, 2, labels, (cv.CV_TERMCRIT_ITER, 100, 0.1), 1, 0, centers)
824 self.assertEqual(int(compact), 0)
828 index = random.randrange(size)
830 self.assertEqual(samples[index, 0], (255, 255, 255))
831 self.assertEqual(labels[index, 0], 1)
833 self.assertEqual(samples[index, 0], (0, 0, 0))
834 self.assertEqual(labels[index, 0], 0)
836 for cluster in (0, 1):
837 for channel in (0, 1, 2):
838 self.assertEqual(int(centers[cluster, channel]), cluster*255)
841 for r in range(1,11):
842 for c in range(1, 11):
843 for t in self.mat_types_single:
844 M = cv.CreateMat(r, c, t)
846 self.assertEqual(cv.Sum(M)[0], r * c)
848 def test_Threshold(self):
849 #""" directed test for bug 2790622 """
850 src = self.get_sample("samples/c/lena.jpg", 0)
853 dst = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_8U, 1)
854 cv.Threshold(src, dst, 128, 128, cv.CV_THRESH_BINARY)
855 results.add(dst.tostring())
856 # Should have produced the same answer every time, so results set should have size 1
857 self.assert_(len(results) == 1)
859 # ticket #71 repro attempt
860 image = self.get_sample("samples/c/lena.jpg", 0)
861 red = cv.CreateImage(cv.GetSize(image), 8, 1)
862 binary = cv.CreateImage(cv.GetSize(image), 8, 1)
863 cv.Split(image, red, None, None, None)
864 cv.Threshold(red, binary, 42, 255, cv.CV_THRESH_BINARY)
866 ##############################################################################
868 def yield_line_image(self):
869 """ Needed by HoughLines tests """
870 src = self.get_sample("samples/cpp/building.jpg", 0)
871 dst = cv.CreateImage(cv.GetSize(src), 8, 1)
872 cv.Canny(src, dst, 50, 200, 3)
875 # Tests for functional areas
877 class AreaTests(OpenCVTests):
879 def test_numpy(self):
880 if 'fromarray' in dir(cv):
883 def convert(numpydims):
884 """ Create a numpy array with specified dims, return the OpenCV CvMat """
885 a1 = numpy.array([1] * reduce(operator.__mul__, numpydims)).reshape(*numpydims).astype(numpy.float32)
886 return cv.fromarray(a1)
890 chan = cv.CV_MAT_CN(cv.GetElemType(m))
891 return (row, col, chan)
893 self.assertEqual(row_col_chan(convert((2, 13))), (2, 13, 1))
894 self.assertEqual(row_col_chan(convert((2, 13, 4))), (2, 13, 4))
895 self.assertEqual(row_col_chan(convert((2, 13, cv.CV_CN_MAX))), (2, 13, cv.CV_CN_MAX))
896 self.assertRaises(TypeError, lambda: convert((2,)))
897 self.assertRaises(TypeError, lambda: convert((11, 17, cv.CV_CN_MAX + 1)))
899 for t in [cv.CV_16UC1, cv.CV_32SC1, cv.CV_32FC1]:
900 for d in [ (8,), (1,7), (2,3,4), (7,9,2,1,8), (1,2,3,4,5,6,7,8) ]:
901 total = reduce(operator.__mul__, d)
902 m = cv.CreateMatND(d, t)
903 for i in range(total):
905 na = numpy.asarray(m).reshape((total,))
906 self.assertEqual(list(na), range(total))
908 # now do numpy -> cvmat, and verify
909 m2 = cv.fromarray(na, True)
911 # Check that new cvmat m2 contains same counting sequence
912 for i in range(total):
913 self.assertEqual(cv.Get1D(m, i)[0], i)
915 # Verify round-trip for 2D arrays
916 for rows in [2, 3, 7, 13]:
917 for cols in [2, 3, 7, 13]:
918 for allowND in [False, True]:
919 im = cv.CreateMatND([rows, cols], cv.CV_16UC1)
921 a = numpy.asarray(im)
922 self.assertEqual(a.shape, (rows, cols))
923 cvmatnd = cv.fromarray(a, allowND)
924 self.assertEqual(cv.GetDims(cvmatnd), (rows, cols))
926 # im, a and cvmatnd all point to the same data, so...
927 for i,coord in enumerate([(0,0), (0,1), (1,0), (1,1)]):
930 self.assertEqual(im[coord], v)
931 self.assertEqual(cvmatnd[coord], v)
933 # Cv -> Numpy 3 channel check
934 im = cv.CreateMatND([2, 13], cv.CV_16UC3)
935 self.assertEqual(numpy.asarray(im).shape, (2, 13, 3))
937 # multi-dimensional NumPy array
938 na = numpy.ones([7,9,2,1,8])
939 cm = cv.fromarray(na, True)
940 self.assertEqual(cv.GetDims(cm), (7,9,2,1,8))
942 # Using an array object for a CvArr parameter
943 ones = numpy.ones((640, 480))
944 r = cv.fromarray(numpy.ones((640, 480)))
945 cv.AddS(cv.fromarray(ones), 7, r)
946 self.assert_(numpy.alltrue(r == (8 * ones)))
948 # create arrays, use them in OpenCV and replace the the array
951 return [random.randrange(1,6) for i in range(random.randrange(1, 6))]
952 arrays = [numpy.ones(randdim()).astype(numpy.uint8) for i in range(10)]
953 cs = [cv.fromarray(a, True) for a in arrays]
954 for i in range(1000):
955 arrays[random.randrange(10)] = numpy.ones(randdim()).astype(numpy.uint8)
956 cs[random.randrange(10)] = cv.fromarray(arrays[random.randrange(10)], True)
958 self.assert_(all([c == chr(1) for c in cs[j].tostring()]))
961 m = numpy.identity(4, dtype = numpy.float32)
962 m = cv.fromarray(m[:3, :3])
963 rvec = cv.CreateMat(3, 1, cv.CV_32FC1)
967 cv.Rodrigues2(rvec, m)
971 print "SKIPPING test_numpy - numpy support not built"
973 def test_boundscatch(self):
974 l2 = cv.CreateMat(256, 1, cv.CV_8U)
975 l2[0,0] # should be OK
976 self.assertRaises(cv.error, lambda: l2[1,1])
978 self.assertRaises(cv.error, lambda: l2[299])
979 for n in range(1, 8):
980 l = cv.CreateMatND([2] * n, cv.CV_8U)
982 self.assertRaises(cv.error, lambda: l[999])
985 l[tup0] # should be OK
987 self.assertRaises(cv.error, lambda: l[tup2])
989 def test_stereo(self):
990 bm = cv.CreateStereoBMState()
991 def illegal_delete():
992 bm = cv.CreateStereoBMState()
994 def illegal_assign():
995 bm = cv.CreateStereoBMState()
996 bm.preFilterType = "foo"
998 self.assertRaises(TypeError, illegal_delete)
999 self.assertRaises(TypeError, illegal_assign)
1001 left = self.get_sample("samples/c/lena.jpg", 0)
1002 right = self.get_sample("samples/c/lena.jpg", 0)
1003 disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
1004 cv.FindStereoCorrespondenceBM(left, right, disparity, bm)
1006 gc = cv.CreateStereoGCState(16, 2)
1007 left_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
1008 right_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
1010 def test_stereo(self):
1011 bm = cv.CreateStereoBMState()
1012 def illegal_delete():
1013 bm = cv.CreateStereoBMState()
1014 del bm.preFilterType
1015 def illegal_assign():
1016 bm = cv.CreateStereoBMState()
1017 bm.preFilterType = "foo"
1019 self.assertRaises(TypeError, illegal_delete)
1020 self.assertRaises(TypeError, illegal_assign)
1022 left = self.get_sample("samples/c/lena.jpg", 0)
1023 right = self.get_sample("samples/c/lena.jpg", 0)
1024 disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
1025 cv.FindStereoCorrespondenceBM(left, right, disparity, bm)
1027 gc = cv.CreateStereoGCState(16, 2)
1028 left_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
1029 right_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
1030 cv.FindStereoCorrespondenceGC(left, right, left_disparity, right_disparity, gc)
1032 def test_kalman(self):
1033 k = cv.CreateKalman(2, 1, 0)
1035 def failing_test_exception(self):
1036 a = cv.CreateImage((640, 480), cv.IPL_DEPTH_8U, 1)
1037 b = cv.CreateImage((640, 480), cv.IPL_DEPTH_8U, 1)
1038 self.assertRaises(cv.error, lambda: cv.Laplace(a, b))
1040 def test_cvmat_accessors(self):
1041 cvm = cv.CreateMat(20, 10, cv.CV_32FC1)
1043 def test_depths(self):
1044 #""" Make sure that the depth enums are unique """
1045 self.assert_(len(self.depths) == len(set(self.depths)))
1047 def test_leak(self):
1048 #""" If CreateImage is not releasing image storage, then the loop below should use ~4GB of memory. """
1049 for i in range(64000):
1050 a = cv.CreateImage((1024,1024), cv.IPL_DEPTH_8U, 1)
1051 for i in range(64000):
1052 a = cv.CreateMat(1024, 1024, cv.CV_8UC1)
1054 def test_histograms(self):
1056 nchans = cv.CV_MAT_CN(cv.GetElemType(im))
1057 c = [ cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 1) for i in range(nchans) ] + [None] * (4 - nchans)
1058 cv.Split(im, c[0], c[1], c[2], c[3])
1062 hist = cv.CreateHist([256] * len(s), cv.CV_HIST_ARRAY, [ (0,255) ] * len(s), 1)
1063 cv.CalcHist(s, hist, 0)
1068 a = cv.CreateHist(dims, cv.CV_HIST_ARRAY , ranges, 1)
1069 src = self.get_sample("samples/c/lena.jpg", 0)
1071 (minv, maxv, minl, maxl) = cv.GetMinMaxHistValue(h)
1072 self.assert_(cv.QueryHistValue_nD(h, minl) == minv)
1073 self.assert_(cv.QueryHistValue_nD(h, maxl) == maxv)
1074 bp = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_8U, 1)
1075 cv.CalcBackProject(split(src), bp, h)
1076 bp = cv.CreateImage((cv.GetSize(src)[0]-2, cv.GetSize(src)[1]-2), cv.IPL_DEPTH_32F, 1)
1077 cv.CalcBackProjectPatch(split(src), bp, (3,3), h, cv.CV_COMP_INTERSECT, 1)
1079 for meth,expected in [(cv.CV_COMP_CORREL, 1.0), (cv.CV_COMP_CHISQR, 0.0), (cv.CV_COMP_INTERSECT, 1.0), (cv.CV_COMP_BHATTACHARYYA, 0.0)]:
1080 self.assertEqual(cv.CompareHist(h, h, meth), expected)
1082 def test_remap(self):
1085 raw = cv.CreateImage((640, 480), cv.IPL_DEPTH_8U, 1)
1086 for x in range(0, 640, 20):
1087 cv.Line(raw, (x,0), (x,480), 255, 1)
1088 for y in range(0, 480, 20):
1089 cv.Line(raw, (0,y), (640,y), 255, 1)
1090 intrinsic_mat = cv.CreateMat(3, 3, cv.CV_32FC1)
1091 distortion_coeffs = cv.CreateMat(1, 4, cv.CV_32FC1)
1093 cv.SetZero(intrinsic_mat)
1094 intrinsic_mat[0,2] = 320.0
1095 intrinsic_mat[1,2] = 240.0
1096 intrinsic_mat[0,0] = 320.0
1097 intrinsic_mat[1,1] = 320.0
1098 intrinsic_mat[2,2] = 1.0
1099 cv.SetZero(distortion_coeffs)
1100 distortion_coeffs[0,0] = 1e-1
1101 mapx = cv.CreateImage((640, 480), cv.IPL_DEPTH_32F, 1)
1102 mapy = cv.CreateImage((640, 480), cv.IPL_DEPTH_32F, 1)
1105 cv.InitUndistortMap(intrinsic_mat, distortion_coeffs, mapx, mapy)
1106 rect = cv.CreateImage((640, 480), cv.IPL_DEPTH_8U, 1)
1109 rMapxy = cv.CreateMat(h, w, cv.CV_16SC2)
1110 rMapa = cv.CreateMat(h, w, cv.CV_16UC1)
1111 cv.ConvertMaps(mapx,mapy,rMapxy,rMapa)
1113 cv.Remap(raw, rect, mapx, mapy)
1114 cv.Remap(raw, rect, rMapxy, rMapa)
1115 cv.Undistort2(raw, rect, intrinsic_mat, distortion_coeffs)
1117 for w in [1, 4, 4095, 4096, 4097, 4100]:
1118 p = cv.CreateImage((w,256), 8, 1)
1119 up = cv.CreateImage((w,256), 8, 1)
1120 cv.Undistort2(p, up, intrinsic_mat, distortion_coeffs)
1122 fptypes = [cv.CV_32FC1, cv.CV_64FC1]
1128 rotation_vector = cv.CreateMat(1, 3, t0)
1129 translation_vector = cv.CreateMat(1, 3, t1)
1130 cv.RandArr(rng, rotation_vector, cv.CV_RAND_UNI, -1.0, 1.0)
1131 cv.RandArr(rng, translation_vector, cv.CV_RAND_UNI, -1.0, 1.0)
1132 object_points = cv.CreateMat(pointsCount, 3, t2)
1133 image_points = cv.CreateMat(pointsCount, 2, t3)
1134 cv.RandArr(rng, object_points, cv.CV_RAND_UNI, -100.0, 100.0)
1135 cv.ProjectPoints2(object_points, rotation_vector, translation_vector, intrinsic_mat, distortion_coeffs, image_points)
1137 reshaped_object_points = cv.Reshape(object_points, 1, 3)
1138 reshaped_image_points = cv.CreateMat(2, pointsCount, t3)
1139 cv.ProjectPoints2(object_points, rotation_vector, translation_vector, intrinsic_mat, distortion_coeffs, reshaped_image_points)
1141 error = cv.Norm(reshaped_image_points, cv.Reshape(image_points, 1, 2))
1142 self.assert_(error < maxError)
1144 def test_arithmetic(self):
1145 a = cv.CreateMat(4, 4, cv.CV_8UC1)
1147 b = cv.CreateMat(4, 4, cv.CV_8UC1)
1149 d = cv.CreateMat(4, 4, cv.CV_8UC1)
1151 self.assertEqual(d[0,0], 54.0)
1153 self.assertEqual(d[0,0], 200.0)
1156 def failing_test_cvtcolor(self):
1157 src3 = self.get_sample("samples/c/lena.jpg")
1158 src1 = self.get_sample("samples/c/lena.jpg", 0)
1159 dst8u = dict([(c,cv.CreateImage(cv.GetSize(src1), cv.IPL_DEPTH_8U, c)) for c in (1,2,3,4)])
1160 dst16u = dict([(c,cv.CreateImage(cv.GetSize(src1), cv.IPL_DEPTH_16U, c)) for c in (1,2,3,4)])
1161 dst32f = dict([(c,cv.CreateImage(cv.GetSize(src1), cv.IPL_DEPTH_32F, c)) for c in (1,2,3,4)])
1163 for srcf in ["BGR", "RGB"]:
1164 for dstf in ["Luv"]:
1165 cv.CvtColor(src3, dst8u[3], eval("cv.CV_%s2%s" % (srcf, dstf)))
1166 cv.CvtColor(src3, dst32f[3], eval("cv.CV_%s2%s" % (srcf, dstf)))
1167 cv.CvtColor(src3, dst8u[3], eval("cv.CV_%s2%s" % (dstf, srcf)))
1169 for srcf in ["BayerBG", "BayerGB", "BayerGR"]:
1170 for dstf in ["RGB", "BGR"]:
1171 cv.CvtColor(src1, dst8u[3], eval("cv.CV_%s2%s" % (srcf, dstf)))
1173 def test_voronoi(self):
1176 storage = cv.CreateMemStorage(0)
1178 def facet_edges(e0):
1181 e = cv.Subdiv2DGetEdge(e, cv.CV_NEXT_AROUND_LEFT)
1190 pts = [ cv.Subdiv2DEdgeOrg(e) for e in facet_edges(edge) ]
1191 if not (None in pts):
1192 l = [p.pt for p in pts]
1194 if not(ls in seensorted):
1196 seensorted.append(ls)
1199 for npoints in range(1, 200):
1200 points = [ (random.randrange(w), random.randrange(h)) for i in range(npoints) ]
1201 subdiv = cv.CreateSubdivDelaunay2D( (0,0,w,h), storage )
1203 cv.SubdivDelaunay2DInsert( subdiv, p)
1204 cv.CalcSubdivVoronoi2D(subdiv)
1205 ars = areas([ cv.Subdiv2DRotateEdge(e, 1) for e in subdiv.edges ] + [ cv.Subdiv2DRotateEdge(e, 3) for e in subdiv.edges ])
1206 self.assert_(len(ars) == len(set(points)))
1209 img = cv.CreateImage((w,h), cv.IPL_DEPTH_8U, 3)
1211 def T(x): return int(x) # int(300+x/16)
1213 cv.FillConvexPoly( img, [(T(x),T(y)) for (x,y) in pts], cv.RGB(100+random.randrange(156),random.randrange(256),random.randrange(256)), cv.CV_AA, 0 );
1215 cv.Circle(img, (T(x), T(y)), 3, cv.RGB(0,0,0), -1)
1217 cv.ShowImage("snap", img)
1218 if cv.WaitKey(10) > 0:
1221 def perf_test_pow(self):
1222 mt = cv.CreateMat(1000, 1000, cv.CV_32FC1)
1223 dst = cv.CreateMat(1000, 1000, cv.CV_32FC1)
1225 cv.RandArr(rng, mt, cv.CV_RAND_UNI, 0, 1000.0)
1228 for a in [0.5, 2.0, 2.3, 2.4, 3.0, 37.1786] + [2.4]*10:
1229 started = time.time()
1232 took = (time.time() - started) / 1e7
1233 print "%4.1f took %f ns" % (a, took * 1e9)
1234 print dst[0,0], 10 ** 2.4
1236 def test_access_row_col(self):
1237 src = cv.CreateImage((8,3), 8, 1)
1242 # in an array (3 rows, 8 columns).
1243 # Then extract the array in various ways.
1245 for r,w in enumerate(("Achilles", "Benedict", "Congreve")):
1246 for c,v in enumerate(w):
1248 self.assertEqual(src.tostring(), "AchillesBenedictCongreve")
1249 self.assertEqual(src[:,:].tostring(), "AchillesBenedictCongreve")
1250 self.assertEqual(src[:,:4].tostring(), "AchiBeneCong")
1251 self.assertEqual(src[:,0].tostring(), "ABC")
1252 self.assertEqual(src[:,4:].tostring(), "llesdictreve")
1253 self.assertEqual(src[::2,:].tostring(), "AchillesCongreve")
1254 self.assertEqual(src[1:,:].tostring(), "BenedictCongreve")
1255 self.assertEqual(src[1:2,:].tostring(), "Benedict")
1256 self.assertEqual(src[::2,:4].tostring(), "AchiCong")
1257 # The mats share the same storage, so updating one should update them all
1259 self.assertEqual(lastword.tostring(), "Congreve")
1261 self.assertEqual(lastword.tostring(), "Kongreve")
1272 mt = cv.CreateMatND([2,3,4], cv.CV_8UC1)
1276 mt[i,j,k] = ord('A') + k + 4 * (j + 3 * i)
1277 self.assertEqual(mt[:,:,:1].tostring(), "AEIMQU")
1278 self.assertEqual(mt[:,:1,:].tostring(), "ABCDMNOP")
1279 self.assertEqual(mt[:1,:,:].tostring(), "ABCDEFGHIJKL")
1280 self.assertEqual(mt[1,1].tostring(), "QRST")
1281 self.assertEqual(mt[:,::2,:].tostring(), "ABCDIJKLMNOPUVWX")
1283 # Exercise explicit GetRows
1284 self.assertEqual(cv.GetRows(src, 0, 3).tostring(), "AchillesBenedictCongreve")
1285 self.assertEqual(cv.GetRows(src, 0, 3, 1).tostring(), "AchillesBenedictCongreve")
1286 self.assertEqual(cv.GetRows(src, 0, 3, 2).tostring(), "AchillesCongreve")
1288 self.assertEqual(cv.GetRow(src, 0).tostring(), "Achilles")
1290 self.assertEqual(cv.GetCols(src, 0, 4).tostring(), "AchiBeneCong")
1292 self.assertEqual(cv.GetCol(src, 0).tostring(), "ABC")
1293 self.assertEqual(cv.GetCol(src, 1).tostring(), "ceo")
1295 self.assertEqual(cv.GetDiag(src, 0).tostring(), "Aen")
1297 # Check that matrix type is preserved by the various operators
1299 for mt in self.mat_types:
1300 m = cv.CreateMat(5, 3, mt)
1301 self.assertEqual(mt, cv.GetElemType(cv.GetRows(m, 0, 2)))
1302 self.assertEqual(mt, cv.GetElemType(cv.GetRow(m, 0)))
1303 self.assertEqual(mt, cv.GetElemType(cv.GetCols(m, 0, 2)))
1304 self.assertEqual(mt, cv.GetElemType(cv.GetCol(m, 0)))
1305 self.assertEqual(mt, cv.GetElemType(cv.GetDiag(m, 0)))
1306 self.assertEqual(mt, cv.GetElemType(m[0]))
1307 self.assertEqual(mt, cv.GetElemType(m[::2]))
1308 self.assertEqual(mt, cv.GetElemType(m[:,0]))
1309 self.assertEqual(mt, cv.GetElemType(m[:,:]))
1310 self.assertEqual(mt, cv.GetElemType(m[::2,:]))
1312 def test_addS_3D(self):
1313 for dim in [ [1,1,4], [2,2,3], [7,4,3] ]:
1314 for ty,ac in [ (cv.CV_32FC1, 'f'), (cv.CV_64FC1, 'd')]:
1315 mat = cv.CreateMatND(dim, ty)
1316 mat2 = cv.CreateMatND(dim, ty)
1317 for increment in [ 0, 3, -1 ]:
1318 cv.SetData(mat, array.array(ac, range(dim[0] * dim[1] * dim[2])), 0)
1319 cv.AddS(mat, increment, mat2)
1320 for i in range(dim[0]):
1321 for j in range(dim[1]):
1322 for k in range(dim[2]):
1323 self.assert_(mat2[i,j,k] == mat[i,j,k] + increment)
1325 def test_buffers(self):
1326 ar = array.array('f', [7] * (360*640))
1328 m = cv.CreateMat(360, 640, cv.CV_32FC1)
1329 cv.SetData(m, ar, 4 * 640)
1330 self.assert_(m[0,0] == 7.0)
1332 m = cv.CreateMatND((360, 640), cv.CV_32FC1)
1333 cv.SetData(m, ar, 4 * 640)
1334 self.assert_(m[0,0] == 7.0)
1336 m = cv.CreateImage((640, 360), cv.IPL_DEPTH_32F, 1)
1337 cv.SetData(m, ar, 4 * 640)
1338 self.assert_(m[0,0] == 7.0)
1340 def xxtest_Filters(self):
1342 m = cv.CreateMat(360, 640, cv.CV_32FC1)
1343 d = cv.CreateMat(360, 640, cv.CV_32FC1)
1344 for k in range(3, 21, 2):
1345 started = time.time()
1346 for i in range(1000):
1347 cv.Smooth(m, m, param1=k)
1348 print k, "took", time.time() - started
1350 def assertSame(self, a, b):
1352 d = cv.CreateMat(h, w, cv.CV_8UC1)
1354 self.assert_(cv.CountNonZero(d) == 0)
1356 def test_text(self):
1357 img = cv.CreateImage((640,40), cv.IPL_DEPTH_8U, 1)
1359 font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1)
1361 cv.PutText(img, message, (320,30), font, 255)
1362 ((w,h),bl) = cv.GetTextSize(message, font)
1364 # Find nonzero in X and Y
1366 for x in range(640):
1367 cv.SetImageROI(img, (x, 0, 1, 40))
1368 Xs.append(cv.Sum(img)[0] > 0)
1370 return (l.index(True), len(l) - list(reversed(l)).index(True))
1374 cv.SetImageROI(img, (0, y, 640, 1))
1375 Ys.append(cv.Sum(img)[0] > 0)
1377 x0,x1 = firstlast(Xs)
1378 y0,y1 = firstlast(Ys)
1379 actual_width = x1 - x0
1380 actual_height = y1 - y0
1382 # actual_width can be up to 8 pixels smaller than GetTextSize says
1383 self.assert_(actual_width <= w)
1384 self.assert_((w - actual_width) <= 8)
1386 # actual_height can be up to 4 pixels smaller than GetTextSize says
1387 self.assert_(actual_height <= (h + bl))
1388 self.assert_(((h + bl) - actual_height) <= 4)
1390 cv.ResetImageROI(img)
1391 self.assert_(w != 0)
1392 self.assert_(h != 0)
1394 def test_sizes(self):
1395 sizes = [ 1, 2, 3, 97, 255, 256, 257, 947 ]
1398 # Create an IplImage
1399 im = cv.CreateImage((w,h), cv.IPL_DEPTH_8U, 1)
1401 self.assert_(cv.Sum(im)[0] == (w * h))
1404 mt = cv.CreateMat(h, w, cv.CV_8UC1)
1406 self.assert_(cv.Sum(mt)[0] == (w * h))
1409 for dim in range(1, cv.CV_MAX_DIM + 1):
1410 for attempt in range(10):
1411 dims = [ random.choice([1,1,1,1,2,3]) for i in range(dim) ]
1412 mt = cv.CreateMatND(dims, cv.CV_8UC1)
1414 self.assert_(cv.Sum(mt)[0] == 0)
1415 # Set to all-ones, verify the sum
1420 self.assert_(cv.Sum(mt)[0] == expected)
1422 def test_random(self):
1423 seeds = [ 0, 1, 2**48, 2**48 + 1 ]
1427 sequences.add(str([cv.RandInt(rng) for i in range(10)]))
1428 self.assert_(len(seeds) == len(sequences))
1431 im = cv.CreateImage((1024,1024), cv.IPL_DEPTH_8U, 1)
1432 cv.RandArr(rng, im, cv.CV_RAND_UNI, 0, 256)
1433 cv.RandArr(rng, im, cv.CV_RAND_NORMAL, 128, 30)
1435 hist = cv.CreateHist([ 256 ], cv.CV_HIST_ARRAY, [ (0,255) ], 1)
1436 cv.CalcHist([im], hist)
1439 for i in range(1000):
1440 v = cv.RandReal(rng)
1441 self.assert_(0 <= v)
1444 for mode in [ cv.CV_RAND_UNI, cv.CV_RAND_NORMAL ]:
1445 for fmt in self.mat_types:
1446 mat = cv.CreateMat(64, 64, fmt)
1447 cv.RandArr(cv.RNG(), mat, mode, (0,0,0,0), (1,1,1,1))
1449 def test_MixChannels(self):
1451 # First part - test the single case described in the documentation
1452 rgba = cv.CreateMat(100, 100, cv.CV_8UC4)
1453 bgr = cv.CreateMat(100, 100, cv.CV_8UC3)
1454 alpha = cv.CreateMat(100, 100, cv.CV_8UC1)
1455 cv.Set(rgba, (1,2,3,4))
1456 cv.MixChannels([rgba], [bgr, alpha], [
1457 (0, 2), # rgba[0] -> bgr[2]
1458 (1, 1), # rgba[1] -> bgr[1]
1459 (2, 0), # rgba[2] -> bgr[0]
1460 (3, 3) # rgba[3] -> alpha[0]
1462 self.assert_(bgr[0,0] == (3,2,1))
1463 self.assert_(alpha[0,0] == 4)
1465 # Second part. Choose random sets of sources and destinations,
1466 # fill them with known values, choose random channel assignments,
1467 # run cvMixChannels and check that the result is as expected.
1471 for rows in [1,2,4,13,64,1000]:
1472 for cols in [1,2,4,13,64,1000]:
1473 for loop in range(5):
1474 sources = [random.choice([1, 2, 3, 4]) for i in range(8)]
1475 dests = [random.choice([1, 2, 3, 4]) for i in range(8)]
1476 # make sure that fromTo does not have duplicates in dests, otherwise the result is not determined
1478 fromTo = [(random.randrange(-1, sum(sources)), random.randrange(sum(dests))) for i in range(random.randrange(1, 30))]
1479 dests_set = list(set([j for (i, j) in fromTo]))
1480 if len(dests_set) == len(dests):
1488 return [cv.CV_8UC1, cv.CV_8UC2, cv.CV_8UC3, cv.CV_8UC4][n-1]
1489 source_m = [cv.CreateMat(rows, cols, CV_8UC(c)) for c in sources]
1490 dest_m = [cv.CreateMat(rows, cols, CV_8UC(c)) for c in dests]
1493 # return the contents of the N channel mat m[0,0] as a N-length list
1494 chans = cv.CV_MAT_CN(cv.GetElemType(m))
1498 return list(m[0,0])[:chans]
1500 # Sources numbered from 50, destinations numbered from 100
1502 for i in range(len(sources)):
1503 s = sum(sources[:i]) + 50
1504 cv.Set(source_m[i], (s, s+1, s+2, s+3))
1505 self.assertEqual(m00(source_m[i]), [s, s+1, s+2, s+3][:sources[i]])
1507 for i in range(len(dests)):
1508 s = sum(dests[:i]) + 100
1509 cv.Set(dest_m[i], (s, s+1, s+2, s+3))
1510 self.assertEqual(m00(dest_m[i]), [s, s+1, s+2, s+3][:dests[i]])
1512 # now run the sanity check
1514 for i in range(len(sources)):
1515 s = sum(sources[:i]) + 50
1516 self.assertEqual(m00(source_m[i]), [s, s+1, s+2, s+3][:sources[i]])
1518 for i in range(len(dests)):
1519 s = sum(dests[:i]) + 100
1520 self.assertEqual(m00(dest_m[i]), [s, s+1, s+2, s+3][:dests[i]])
1522 cv.MixChannels(source_m, dest_m, fromTo)
1524 expected = range(100, 100 + sum(dests))
1525 for (i, j) in fromTo:
1529 expected[j] = 50 + i
1531 actual = sum([m00(m) for m in dest_m], [])
1532 self.assertEqual(sum([m00(m) for m in dest_m], []), expected)
1534 def test_allocs(self):
1535 mats = [ 0 for i in range(20) ]
1536 for i in range(1000):
1537 m = cv.CreateMat(random.randrange(10, 512), random.randrange(10, 512), cv.CV_8UC1)
1538 j = random.randrange(len(mats))
1542 def test_access(self):
1543 cnames = { 1:cv.CV_32FC1, 2:cv.CV_32FC2, 3:cv.CV_32FC3, 4:cv.CV_32FC4 }
1545 for w in range(1,11):
1546 for h in range(2,11):
1548 for o in [ cv.CreateMat(h, w, cnames[c]), cv.CreateImage((w,h), cv.IPL_DEPTH_32F, c) ][1:]:
1549 pattern = [ (i,j) for i in range(w) for j in range(h) ]
1550 random.shuffle(pattern)
1551 for k,(i,j) in enumerate(pattern):
1556 for k,(i,j) in enumerate(pattern):
1558 self.assert_(o[j,i] == k)
1560 self.assert_(o[j,i] == (k,)*c)
1562 test_mat = cv.CreateMat(2, 3, cv.CV_32FC1)
1563 cv.SetData(test_mat, array.array('f', range(6)), 12)
1564 self.assertEqual(cv.GetDims(test_mat[0]), (1, 3))
1565 self.assertEqual(cv.GetDims(test_mat[1]), (1, 3))
1566 self.assertEqual(cv.GetDims(test_mat[0:1]), (1, 3))
1567 self.assertEqual(cv.GetDims(test_mat[1:2]), (1, 3))
1568 self.assertEqual(cv.GetDims(test_mat[-1:]), (1, 3))
1569 self.assertEqual(cv.GetDims(test_mat[-1]), (1, 3))
1571 def xxxtest_corners(self):
1572 a = cv.LoadImage("foo-mono.png", 0)
1573 cv.AdaptiveThreshold(a, a, 255, param1=5)
1574 scribble = cv.CreateImage(cv.GetSize(a), 8, 3)
1575 cv.CvtColor(a, scribble, cv.CV_GRAY2BGR)
1577 eig_image = cv.CreateImage(cv.GetSize(a), cv.IPL_DEPTH_32F, 1)
1578 temp_image = cv.CreateImage(cv.GetSize(a), cv.IPL_DEPTH_32F, 1)
1579 pts = cv.GoodFeaturesToTrack(a, eig_image, temp_image, 100, 0.04, 2, use_harris=1)
1581 cv.Circle( scribble, p, 1, cv.RGB(255,0,0), -1 )
1583 canny = cv.CreateImage(cv.GetSize(a), 8, 1)
1584 cv.SubRS(a, 255, canny)
1586 li = cv.HoughLines2(canny,
1587 cv.CreateMemStorage(),
1588 cv.CV_HOUGH_STANDARD,
1594 for (rho,theta) in li:
1601 (x0 + 1000*(-s), y0 + 1000*c),
1602 (x0 + -1000*(-s), y0 - 1000*c),
1606 def test_calibration(self):
1608 def get_corners(mono, refine = False):
1609 (ok, corners) = cv.FindChessboardCorners(mono, (num_x_ints, num_y_ints), cv.CV_CALIB_CB_ADAPTIVE_THRESH | cv.CV_CALIB_CB_NORMALIZE_IMAGE)
1611 corners = cv.FindCornerSubPix(mono, corners, (5,5), (-1,-1), ( cv.CV_TERMCRIT_EPS+cv.CV_TERMCRIT_ITER, 30, 0.1 ))
1612 return (ok, corners)
1614 def mk_object_points(nimages, squaresize = 1):
1615 opts = cv.CreateMat(nimages * num_pts, 3, cv.CV_32FC1)
1616 for i in range(nimages):
1617 for j in range(num_pts):
1618 opts[i * num_pts + j, 0] = (j / num_x_ints) * squaresize
1619 opts[i * num_pts + j, 1] = (j % num_x_ints) * squaresize
1620 opts[i * num_pts + j, 2] = 0
1623 def mk_image_points(goodcorners):
1624 ipts = cv.CreateMat(len(goodcorners) * num_pts, 2, cv.CV_32FC1)
1625 for (i, co) in enumerate(goodcorners):
1626 for j in range(num_pts):
1627 ipts[i * num_pts + j, 0] = co[j][0]
1628 ipts[i * num_pts + j, 1] = co[j][1]
1631 def mk_point_counts(nimages):
1632 npts = cv.CreateMat(nimages, 1, cv.CV_32SC1)
1633 for i in range(nimages):
1634 npts[i, 0] = num_pts
1637 def cvmat_iterator(cvmat):
1638 for i in range(cvmat.rows):
1639 for j in range(cvmat.cols):
1642 def image_from_archive(tar, name):
1643 member = tar.getmember(name)
1644 filedata = tar.extractfile(member).read()
1645 imagefiledata = cv.CreateMat(1, len(filedata), cv.CV_8UC1)
1646 cv.SetData(imagefiledata, filedata, len(filedata))
1647 return cv.DecodeImageM(imagefiledata)
1649 urllib.urlretrieve("http://docs.opencv.org/data/camera_calibration.tar.gz", "camera_calibration.tar.gz")
1650 tf = tarfile.open("camera_calibration.tar.gz")
1654 num_pts = num_x_ints * num_y_ints
1656 leftimages = [image_from_archive(tf, "wide/left%04d.pgm" % i) for i in range(3, 15)]
1657 size = cv.GetSize(leftimages[0])
1662 corners = [get_corners(i) for i in leftimages]
1663 goodcorners = [co for (im, (ok, co)) in zip(leftimages, corners) if ok]
1665 ipts = mk_image_points(goodcorners)
1666 opts = mk_object_points(len(goodcorners), .1)
1667 npts = mk_point_counts(len(goodcorners))
1669 intrinsics = cv.CreateMat(3, 3, cv.CV_64FC1)
1670 distortion = cv.CreateMat(4, 1, cv.CV_64FC1)
1671 cv.SetZero(intrinsics)
1672 cv.SetZero(distortion)
1673 # focal lengths have 1/1 ratio
1674 intrinsics[0,0] = 1.0
1675 intrinsics[1,1] = 1.0
1676 cv.CalibrateCamera2(opts, ipts, npts,
1677 cv.GetSize(leftimages[0]),
1680 cv.CreateMat(len(goodcorners), 3, cv.CV_32FC1),
1681 cv.CreateMat(len(goodcorners), 3, cv.CV_32FC1),
1682 flags = 0) # cv.CV_CALIB_ZERO_TANGENT_DIST)
1683 # print "D =", list(cvmat_iterator(distortion))
1684 # print "K =", list(cvmat_iterator(intrinsics))
1686 newK = cv.CreateMat(3, 3, cv.CV_64FC1)
1687 cv.GetOptimalNewCameraMatrix(intrinsics, distortion, size, 1.0, newK)
1688 # print "newK =", list(cvmat_iterator(newK))
1690 mapx = cv.CreateImage((640, 480), cv.IPL_DEPTH_32F, 1)
1691 mapy = cv.CreateImage((640, 480), cv.IPL_DEPTH_32F, 1)
1692 for K in [ intrinsics, newK ]:
1693 cv.InitUndistortMap(K, distortion, mapx, mapy)
1694 for img in leftimages[:1]:
1695 r = cv.CloneMat(img)
1696 cv.Remap(img, r, mapx, mapy)
1697 # cv.ShowImage("snap", r)
1700 rightimages = [image_from_archive(tf, "wide/right%04d.pgm" % i) for i in range(3, 15)]
1705 lcorners = [get_corners(i) for i in leftimages]
1706 rcorners = [get_corners(i) for i in rightimages]
1707 good = [(lco, rco) for ((lok, lco), (rok, rco)) in zip(lcorners, rcorners) if (lok and rok)]
1709 lipts = mk_image_points([l for (l, r) in good])
1710 ripts = mk_image_points([r for (l, r) in good])
1711 opts = mk_object_points(len(good), .108)
1712 npts = mk_point_counts(len(good))
1714 flags = cv.CV_CALIB_FIX_ASPECT_RATIO | cv.CV_CALIB_FIX_INTRINSIC
1715 flags = cv.CV_CALIB_SAME_FOCAL_LENGTH + cv.CV_CALIB_FIX_PRINCIPAL_POINT + cv.CV_CALIB_ZERO_TANGENT_DIST
1718 T = cv.CreateMat(3, 1, cv.CV_64FC1)
1719 R = cv.CreateMat(3, 3, cv.CV_64FC1)
1720 lintrinsics = cv.CreateMat(3, 3, cv.CV_64FC1)
1721 ldistortion = cv.CreateMat(4, 1, cv.CV_64FC1)
1722 rintrinsics = cv.CreateMat(3, 3, cv.CV_64FC1)
1723 rdistortion = cv.CreateMat(4, 1, cv.CV_64FC1)
1724 lR = cv.CreateMat(3, 3, cv.CV_64FC1)
1725 rR = cv.CreateMat(3, 3, cv.CV_64FC1)
1726 lP = cv.CreateMat(3, 4, cv.CV_64FC1)
1727 rP = cv.CreateMat(3, 4, cv.CV_64FC1)
1728 lmapx = cv.CreateImage(size, cv.IPL_DEPTH_32F, 1)
1729 lmapy = cv.CreateImage(size, cv.IPL_DEPTH_32F, 1)
1730 rmapx = cv.CreateImage(size, cv.IPL_DEPTH_32F, 1)
1731 rmapy = cv.CreateImage(size, cv.IPL_DEPTH_32F, 1)
1733 cv.SetIdentity(lintrinsics)
1734 cv.SetIdentity(rintrinsics)
1735 lintrinsics[0,2] = size[0] * 0.5
1736 lintrinsics[1,2] = size[1] * 0.5
1737 rintrinsics[0,2] = size[0] * 0.5
1738 rintrinsics[1,2] = size[1] * 0.5
1739 cv.SetZero(ldistortion)
1740 cv.SetZero(rdistortion)
1742 cv.StereoCalibrate(opts, lipts, ripts, npts,
1743 lintrinsics, ldistortion,
1744 rintrinsics, rdistortion,
1748 cv.CreateMat(3, 3, cv.CV_32FC1), # E
1749 cv.CreateMat(3, 3, cv.CV_32FC1), # F
1750 (cv.CV_TERMCRIT_ITER + cv.CV_TERMCRIT_EPS, 30, 1e-5),
1753 for a in [-1, 0, 1]:
1754 cv.StereoRectify(lintrinsics,
1764 cv.InitUndistortRectifyMap(lintrinsics, ldistortion, lR, lP, lmapx, lmapy)
1765 cv.InitUndistortRectifyMap(rintrinsics, rdistortion, rR, rP, rmapx, rmapy)
1767 for l,r in zip(leftimages, rightimages)[:1]:
1770 cv.Remap(l, l_, lmapx, lmapy)
1771 cv.Remap(r, r_, rmapx, rmapy)
1772 # cv.ShowImage("snap", l_)
1776 def xxx_test_Disparity(self):
1778 for t in ["8U", "8S", "16U", "16S", "32S", "32F", "64F" ]:
1780 nm = "%sC%d" % (t, c)
1781 print "int32 CV_%s=%d" % (nm, eval("cv.CV_%s" % nm))
1783 integral = cv.CreateImage((641,481), cv.IPL_DEPTH_32S, 1)
1784 L = cv.LoadImage("f0-left.png", 0)
1785 R = cv.LoadImage("f0-right.png", 0)
1786 d = cv.CreateImage(cv.GetSize(L), cv.IPL_DEPTH_8U, 1)
1787 Rn = cv.CreateImage(cv.GetSize(L), cv.IPL_DEPTH_8U, 1)
1788 started = time.time()
1789 for i in range(100):
1791 cv.Integral(d, integral)
1792 cv.SetImageROI(R, (1, 1, 639, 479))
1793 cv.SetImageROI(Rn, (0, 0, 639, 479))
1797 print 1e3 * (time.time() - started) / 100, "ms"
1800 def local_test_lk(self):
1801 seq = [cv.LoadImage("track/%06d.png" % i, 0) for i in range(40)]
1802 crit = (cv.CV_TERMCRIT_ITER, 100, 0.1)
1803 crit = (cv.CV_TERMCRIT_EPS, 0, 0.001)
1805 for i in range(1,40):
1806 r = cv.CalcOpticalFlowPyrLK(seq[0], seq[i], None, None, [(32,32)], (7,7), 0, crit, 0)
1810 a = cv.CreateImage((1024,1024), 8, 1)
1811 b = cv.CreateImage((1024,1024), 8, 1)
1812 cv.Resize(seq[0], a, cv.CV_INTER_NN)
1813 cv.Resize(seq[i], b, cv.CV_INTER_NN)
1814 cv.Line(a, (0, 512), (1024, 512), 255)
1815 cv.Line(a, (512,0), (512,1024), 255)
1816 x,y = [int(c) for c in pos]
1817 cv.Line(b, (0, y*16), (1024, y*16), 255)
1818 cv.Line(b, (x*16,0), (x*16,1024), 255)
1823 def local_test_Haar(self):
1825 hcfile = os.environ['OPENCV_ROOT'] + '/share/opencv/haarcascades/haarcascade_frontalface_default.xml'
1826 hc = cv.Load(hcfile)
1827 img = cv.LoadImage('Stu.jpg', 0)
1828 faces = cv.HaarDetectObjects(img, hc, cv.CreateMemStorage())
1829 self.assert_(len(faces) > 0)
1830 for (x,y,w,h),n in faces:
1831 cv.Rectangle(img, (x,y), (x+w,y+h), 255)
1834 def test_create(self):
1835 #""" CvCreateImage, CvCreateMat and the header-only form """
1836 for (w,h) in [ (320,400), (640,480), (1024, 768) ]:
1837 data = "z" * (w * h)
1839 im = cv.CreateImage((w,h), 8, 1)
1840 cv.SetData(im, data, w)
1841 im2 = cv.CreateImageHeader((w,h), 8, 1)
1842 cv.SetData(im2, data, w)
1843 self.assertSame(im, im2)
1845 m = cv.CreateMat(h, w, cv.CV_8UC1)
1846 cv.SetData(m, data, w)
1847 m2 = cv.CreateMatHeader(h, w, cv.CV_8UC1)
1848 cv.SetData(m2, data, w)
1849 self.assertSame(m, m2)
1851 self.assertSame(im, m)
1852 self.assertSame(im2, m2)
1855 def test_casts(self):
1856 im = cv.GetImage(self.get_sample("samples/c/lena.jpg", 0))
1857 data = im.tostring()
1858 cv.SetData(im, data, cv.GetSize(im)[0])
1860 start_count = sys.getrefcount(data)
1862 # Conversions should produce same data
1863 self.assertSame(im, cv.GetImage(im))
1865 self.assertSame(im, m)
1866 self.assertSame(m, cv.GetImage(m))
1867 im2 = cv.GetImage(m)
1868 self.assertSame(im, im2)
1870 self.assertEqual(sys.getrefcount(data), start_count + 2)
1872 self.assertEqual(sys.getrefcount(data), start_count + 1)
1874 self.assertEqual(sys.getrefcount(data), start_count)
1876 self.assertEqual(sys.getrefcount(data), start_count - 1)
1878 def test_morphological(self):
1879 im = cv.CreateImage((128, 128), cv.IPL_DEPTH_8U, 1)
1880 cv.Resize(cv.GetImage(self.get_sample("samples/c/lena.jpg", 0)), im)
1881 dst = cv.CloneImage(im)
1883 # Check defaults by asserting that all these operations produce the same image
1885 lambda: cv.Dilate(im, dst),
1886 lambda: cv.Dilate(im, dst, None),
1887 lambda: cv.Dilate(im, dst, iterations = 1),
1888 lambda: cv.Dilate(im, dst, element = None),
1889 lambda: cv.Dilate(im, dst, iterations = 1, element = None),
1890 lambda: cv.Dilate(im, dst, element = None, iterations = 1),
1892 src_h = self.hashimg(im)
1896 hashes.add(self.hashimg(dst))
1897 self.assertNotEqual(src_h, self.hashimg(dst))
1898 # Source image should be untouched
1899 self.assertEqual(self.hashimg(im), src_h)
1900 # All results should be same
1901 self.assertEqual(len(hashes), 1)
1904 shapes = [eval("cv.CV_SHAPE_%s" % s) for s in ['RECT', 'CROSS', 'ELLIPSE']]
1905 elements = [cv.CreateStructuringElementEx(sz, sz, sz / 2 + 1, sz / 2 + 1, shape) for sz in [3, 4, 7, 20] for shape in shapes]
1906 elements += [cv.CreateStructuringElementEx(7, 7, 3, 3, cv.CV_SHAPE_CUSTOM, [1] * 49)]
1909 cv.Dilate(im, dst, e, iter)
1910 cv.Erode(im, dst, e, iter)
1911 temp = cv.CloneImage(im)
1912 for op in ["OPEN", "CLOSE", "GRADIENT", "TOPHAT", "BLACKHAT"]:
1913 cv.MorphologyEx(im, dst, temp, e, eval("cv.CV_MOP_%s" % op), iter)
1915 def test_getmat_nd(self):
1916 # 1D CvMatND should yield (N,1) CvMat
1917 matnd = cv.CreateMatND([13], cv.CV_8UC1)
1918 self.assertEqual(cv.GetDims(cv.GetMat(matnd, allowND = True)), (13, 1))
1920 # 2D CvMatND should yield 2D CvMat
1921 matnd = cv.CreateMatND([11, 12], cv.CV_8UC1)
1922 self.assertEqual(cv.GetDims(cv.GetMat(matnd, allowND = True)), (11, 12))
1924 if 0: # XXX - ticket #149
1925 # 3D CvMatND should yield (N,1) CvMat
1926 matnd = cv.CreateMatND([7, 8, 9], cv.CV_8UC1)
1927 self.assertEqual(cv.GetDims(cv.GetMat(matnd, allowND = True)), (7 * 8 * 9, 1))
1929 def test_clipline(self):
1930 self.assert_(cv.ClipLine((100,100), (-100,0), (500,0)) == ((0,0), (99,0)))
1931 self.assert_(cv.ClipLine((100,100), (-100,0), (-200,0)) == None)
1933 def test_smoke_image_processing(self):
1934 src = self.get_sample("samples/c/lena.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
1935 #dst = cv.CloneImage(src)
1936 for aperture_size in [1, 3, 5, 7]:
1937 dst_16s = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_16S, 1)
1938 dst_32f = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_32F, 1)
1940 cv.Sobel(src, dst_16s, 1, 1, aperture_size)
1941 cv.Laplace(src, dst_16s, aperture_size)
1942 cv.PreCornerDetect(src, dst_32f)
1943 eigendst = cv.CreateImage((6*cv.GetSize(src)[0], cv.GetSize(src)[1]), cv.IPL_DEPTH_32F, 1)
1944 cv.CornerEigenValsAndVecs(src, eigendst, 8, aperture_size)
1945 cv.CornerMinEigenVal(src, dst_32f, 8, aperture_size)
1946 cv.CornerHarris(src, dst_32f, 8, aperture_size)
1947 cv.CornerHarris(src, dst_32f, 8, aperture_size, 0.1)
1951 def test_fitline(self):
1952 cv.FitLine([ (1,1), (10,10) ], cv.CV_DIST_L2, 0, 0.01, 0.01)
1953 cv.FitLine([ (1,1,1), (10,10,10) ], cv.CV_DIST_L2, 0, 0.01, 0.01)
1954 a = self.get_sample("samples/c/lena.jpg", 0)
1955 eig_image = cv.CreateImage(cv.GetSize(a), cv.IPL_DEPTH_32F, 1)
1956 temp_image = cv.CreateImage(cv.GetSize(a), cv.IPL_DEPTH_32F, 1)
1957 pts = cv.GoodFeaturesToTrack(a, eig_image, temp_image, 100, 0.04, 2, useHarris=1)
1958 hull = cv.ConvexHull2(pts, cv.CreateMemStorage(), return_points = 1)
1959 cv.FitLine(hull, cv.CV_DIST_L2, 0, 0.01, 0.01)
1961 def test_moments(self):
1962 im = self.get_sample("samples/c/lena.jpg", 0)
1964 for fld in ["m00", "m10", "m01", "m20", "m11", "m02", "m30", "m21", "m12", "m03", "mu20", "mu11", "mu02", "mu30", "mu21", "mu12", "mu03", "inv_sqrt_m00"]:
1965 self.assert_(isinstance(getattr(mo, fld), float))
1966 x = getattr(mo, fld)
1967 self.assert_(isinstance(x, float))
1970 for x_order in range(4):
1971 for y_order in range(4 - x_order):
1972 orders.append((x_order, y_order))
1974 # Just a smoke test for these three functions
1975 [ cv.GetSpatialMoment(mo, xo, yo) for (xo,yo) in orders ]
1976 [ cv.GetCentralMoment(mo, xo, yo) for (xo,yo) in orders ]
1977 [ cv.GetNormalizedCentralMoment(mo, xo, yo) for (xo,yo) in orders ]
1979 # Hu Moments we can do slightly better. Check that the first
1980 # six are invariant wrt image reflection, and that the 7th
1983 hu0 = cv.GetHuMoments(cv.Moments(im))
1985 hu1 = cv.GetHuMoments(cv.Moments(im))
1986 self.assert_(len(hu0) == 7)
1987 self.assert_(len(hu1) == 7)
1989 self.assert_(abs(hu0[i] - hu1[i]) < 1e-6)
1990 self.assert_(abs(hu0[i] + hu1[i]) < 1e-6)
1992 def test_encode(self):
1993 im = self.get_sample("samples/c/lena.jpg", 1)
1994 jpeg = cv.EncodeImage(".jpeg", im)
1996 # Smoke jpeg compression at various qualities
1997 sizes = dict([(qual, cv.EncodeImage(".jpeg", im, [cv.CV_IMWRITE_JPEG_QUALITY, qual]).cols) for qual in range(5, 100, 5)])
1999 # Check that the default QUALITY is 95
2000 self.assertEqual(cv.EncodeImage(".jpeg", im).cols, sizes[95])
2002 # Check that the 'round-trip' gives an image of the same size
2003 round_trip = cv.DecodeImage(cv.EncodeImage(".jpeg", im, [cv.CV_IMWRITE_JPEG_QUALITY, 10]))
2004 self.assert_(cv.GetSize(round_trip) == cv.GetSize(im))
2006 def test_reduce(self):
2007 srcmat = cv.CreateMat(2, 3, cv.CV_32FC1)
2016 def doreduce(siz, rfunc):
2017 dst = cv.CreateMat(siz[0], siz[1], cv.CV_32FC1)
2020 return [dst[i,0] for i in range(siz[0])]
2022 return [dst[0,i] for i in range(siz[1])]
2025 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst)), [3, 5, 7])
2026 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst, -1)), [3, 5, 7])
2027 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst, 0)), [3, 5, 7])
2028 self.assertEqual(doreduce((2,1), lambda dst: cv.Reduce(srcmat, dst, 1)), [3, 12])
2031 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst, op = cv.CV_REDUCE_SUM)), [3, 5, 7])
2032 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst, op = cv.CV_REDUCE_AVG)), [1.5, 2.5, 3.5])
2033 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst, op = cv.CV_REDUCE_MAX)), [3, 4, 5])
2034 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst, op = cv.CV_REDUCE_MIN)), [0, 1, 2])
2036 # exercise both dim and op
2037 self.assertEqual(doreduce((1,3), lambda dst: cv.Reduce(srcmat, dst, 0, cv.CV_REDUCE_MAX)), [3, 4, 5])
2038 self.assertEqual(doreduce((2,1), lambda dst: cv.Reduce(srcmat, dst, 1, cv.CV_REDUCE_MAX)), [2, 5])
2040 def test_operations(self):
2043 def __init__(self, data = None):
2044 self.m = cv.CreateMat(1, 32, cv.CV_32FC1)
2046 cv.SetData(self.m, array.array('f', data), 128)
2048 def __add__(self, other):
2050 if isinstance(other, Im):
2051 cv.Add(self.m, other.m, r.m)
2053 cv.AddS(self.m, (other,), r.m)
2056 def __sub__(self, other):
2058 if isinstance(other, Im):
2059 cv.Sub(self.m, other.m, r.m)
2061 cv.SubS(self.m, (other,), r.m)
2064 def __rsub__(self, other):
2066 cv.SubRS(self.m, (other,), r.m)
2069 def __mul__(self, other):
2071 if isinstance(other, Im):
2072 cv.Mul(self.m, other.m, r.m)
2074 cv.ConvertScale(self.m, r.m, other)
2077 def __rmul__(self, other):
2079 cv.ConvertScale(self.m, r.m, other)
2082 def __div__(self, other):
2084 if isinstance(other, Im):
2085 cv.Div(self.m, other.m, r.m)
2087 cv.ConvertScale(self.m, r.m, 1.0 / other)
2090 def __pow__(self, other):
2092 cv.Pow(self.m, r.m, other)
2100 def __getitem__(self, i):
2106 expected = op(a[i], b[i])
2107 self.assertAlmostEqual(expected, r[i], 4)
2109 a = Im([random.randrange(1, 256) for i in range(32)])
2110 b = Im([random.randrange(1, 256) for i in range(32)])
2112 # simple operations first
2113 verify(lambda x, y: x + y)
2114 verify(lambda x, y: x + 3)
2115 verify(lambda x, y: x + 0)
2116 verify(lambda x, y: x + -8)
2118 verify(lambda x, y: x - y)
2119 verify(lambda x, y: x - 1)
2120 verify(lambda x, y: 1 - x)
2122 verify(lambda x, y: abs(x))
2124 verify(lambda x, y: x * y)
2125 verify(lambda x, y: x * 3)
2127 verify(lambda x, y: x / y)
2128 verify(lambda x, y: x / 2)
2130 for p in [-2, -1, -0.5, -0.1, 0, 0.1, 0.5, 1, 2 ]:
2131 verify(lambda x, y: (x ** p) + (y ** p))
2134 verify(lambda x, y: x - 4 * abs(y))
2135 verify(lambda x, y: abs(y) / x)
2138 verify(lambda x, y: 2 * x + 3 * (y ** 0.5))
2140 def temp_test(self):
2143 def failing_test_rand_GetStarKeypoints(self):
2144 # GetStarKeypoints [<cvmat(type=4242400d rows=64 cols=64 step=512 )>, <cv.cvmemstorage object at 0xb7cc40d0>, (45, 0.73705234376883488, 0.64282591451367344, 0.1567738743689836, 3)]
2145 print cv.CV_MAT_CN(0x4242400d)
2146 mat = cv.CreateMat( 64, 64, cv.CV_32FC2)
2147 cv.GetStarKeypoints(mat, cv.CreateMemStorage(), (45, 0.73705234376883488, 0.64282591451367344, 0.1567738743689836, 3))
2150 def test_rand_PutText(self):
2151 #""" Test for bug 2829336 """
2152 mat = cv.CreateMat( 64, 64, cv.CV_8UC1)
2153 font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1)
2154 cv.PutText(mat, chr(127), (20, 20), font, 255)
2156 def failing_test_rand_FindNearestPoint2D(self):
2157 subdiv = cv.CreateSubdivDelaunay2D((0,0,100,100), cv.CreateMemStorage())
2158 cv.SubdivDelaunay2DInsert( subdiv, (50, 50))
2159 cv.CalcSubdivVoronoi2D(subdiv)
2161 for e in subdiv.edges:
2163 print " ", cv.Subdiv2DEdgeOrg(e)
2164 print " ", cv.Subdiv2DEdgeOrg(cv.Subdiv2DRotateEdge(e, 1)), cv.Subdiv2DEdgeDst(cv.Subdiv2DRotateEdge(e, 1))
2165 print "nearest", cv.FindNearestPoint2D(subdiv, (1.0, 1.0))
2167 class DocumentFragmentTests(OpenCVTests):
2168 """ Test the fragments of code that are included in the documentation """
2170 OpenCVTests.setUp(self)
2171 sys.path.append(".")
2173 def test_precornerdetect(self):
2174 from precornerdetect import precornerdetect
2175 im = self.get_sample("samples/cpp/right01.jpg", 0)
2176 imf = cv.CreateMat(im.rows, im.cols, cv.CV_32FC1)
2177 cv.ConvertScale(im, imf)
2178 (r0,r1) = precornerdetect(imf)
2180 self.assertEqual(im.cols, r.cols)
2181 self.assertEqual(im.rows, r.rows)
2183 def test_findstereocorrespondence(self):
2184 from findstereocorrespondence import findstereocorrespondence
2185 (l,r) = [self.get_sample("samples/cpp/tsukuba_%s.png" % c, cv.CV_LOAD_IMAGE_GRAYSCALE) for c in "lr"]
2187 (disparity_left, disparity_right) = findstereocorrespondence(l, r)
2189 disparity_left_visual = cv.CreateMat(l.rows, l.cols, cv.CV_8U)
2190 cv.ConvertScale(disparity_left, disparity_left_visual, -16)
2191 # self.snap(disparity_left_visual)
2193 def test_calchist(self):
2194 from calchist import hs_histogram
2195 i1 = self.get_sample("samples/c/lena.jpg")
2196 i2 = self.get_sample("samples/cpp/building.jpg")
2197 i3 = cv.CloneMat(i1)
2199 h1 = hs_histogram(i1)
2200 h2 = hs_histogram(i2)
2201 h3 = hs_histogram(i3)
2202 self.assertEqual(self.hashimg(h1), self.hashimg(h3))
2203 self.assertNotEqual(self.hashimg(h1), self.hashimg(h2))
2205 if __name__ == '__main__':
2206 print "testing", cv.__version__
2209 # optlist, args = getopt.getopt(sys.argv[1:], 'l:rd')
2213 # for o,a in optlist:
2221 # cases = [PreliminaryTests, FunctionTests, AreaTests]
2223 # cases += [DocumentFragmentTests]
2224 # everything = [(tc, t) for tc in cases for t in unittest.TestLoader().getTestCaseNames(tc) ]
2225 # if len(args) == 0:
2226 # # cases = [NewTests]
2229 # args = [(tc, t) for (tc, t) in everything if t in args]
2231 # suite = unittest.TestSuite()
2232 # for l in range(loops):
2234 # random.shuffle(args)
2236 # suite.addTest(tc(t))
2237 # unittest.TextTestRunner(verbosity=2).run(suite)