|
|
|
#!/usr/bin/env python
|
|
|
|
import cv2 as cv
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
from tests_common import NewOpenCVTests
|
|
|
|
|
|
|
|
class stitching_test(NewOpenCVTests):
|
|
|
|
|
|
|
|
def test_simple(self):
|
|
|
|
|
|
|
|
img1 = self.get_sample('stitching/a1.png')
|
|
|
|
img2 = self.get_sample('stitching/a2.png')
|
|
|
|
|
|
|
|
stitcher = cv.Stitcher.create(cv.Stitcher_PANORAMA)
|
|
|
|
(_result, pano) = stitcher.stitch((img1, img2))
|
|
|
|
|
|
|
|
#cv.imshow("pano", pano)
|
|
|
|
#cv.waitKey()
|
|
|
|
|
|
|
|
self.assertAlmostEqual(pano.shape[0], 685, delta=100, msg="rows: %r" % list(pano.shape))
|
|
|
|
self.assertAlmostEqual(pano.shape[1], 1025, delta=100, msg="cols: %r" % list(pano.shape))
|
|
|
|
|
|
|
|
|
|
|
|
class stitching_detail_test(NewOpenCVTests):
|
|
|
|
|
|
|
|
def test_simple(self):
|
|
|
|
img = self.get_sample('stitching/a1.png')
|
|
|
|
finder= cv.ORB.create()
|
|
|
|
imgFea = cv.detail.computeImageFeatures2(finder,img)
|
|
|
|
self.assertIsNotNone(imgFea)
|
|
|
|
|
|
|
|
# Added Test for PR #21180
|
|
|
|
self.assertIsNotNone(imgFea.keypoints)
|
|
|
|
|
|
|
|
matcher = cv.detail_BestOf2NearestMatcher(False, 0.3)
|
|
|
|
self.assertIsNotNone(matcher)
|
|
|
|
matcher = cv.detail_AffineBestOf2NearestMatcher(False, False, 0.3)
|
|
|
|
self.assertIsNotNone(matcher)
|
|
|
|
matcher = cv.detail_BestOf2NearestRangeMatcher(2, False, 0.3)
|
|
|
|
self.assertIsNotNone(matcher)
|
|
|
|
estimator = cv.detail_AffineBasedEstimator()
|
|
|
|
self.assertIsNotNone(estimator)
|
|
|
|
estimator = cv.detail_HomographyBasedEstimator()
|
|
|
|
self.assertIsNotNone(estimator)
|
|
|
|
|
|
|
|
adjuster = cv.detail_BundleAdjusterReproj()
|
|
|
|
self.assertIsNotNone(adjuster)
|
|
|
|
adjuster = cv.detail_BundleAdjusterRay()
|
|
|
|
self.assertIsNotNone(adjuster)
|
|
|
|
adjuster = cv.detail_BundleAdjusterAffinePartial()
|
|
|
|
self.assertIsNotNone(adjuster)
|
|
|
|
adjuster = cv.detail_NoBundleAdjuster()
|
|
|
|
self.assertIsNotNone(adjuster)
|
|
|
|
|
|
|
|
compensator=cv.detail.ExposureCompensator_createDefault(cv.detail.ExposureCompensator_NO)
|
|
|
|
self.assertIsNotNone(compensator)
|
|
|
|
compensator=cv.detail.ExposureCompensator_createDefault(cv.detail.ExposureCompensator_GAIN)
|
|
|
|
self.assertIsNotNone(compensator)
|
|
|
|
compensator=cv.detail.ExposureCompensator_createDefault(cv.detail.ExposureCompensator_GAIN_BLOCKS)
|
|
|
|
self.assertIsNotNone(compensator)
|
|
|
|
|
|
|
|
seam_finder = cv.detail.SeamFinder_createDefault(cv.detail.SeamFinder_NO)
|
|
|
|
self.assertIsNotNone(seam_finder)
|
|
|
|
seam_finder = cv.detail.SeamFinder_createDefault(cv.detail.SeamFinder_NO)
|
|
|
|
self.assertIsNotNone(seam_finder)
|
|
|
|
seam_finder = cv.detail.SeamFinder_createDefault(cv.detail.SeamFinder_VORONOI_SEAM)
|
|
|
|
self.assertIsNotNone(seam_finder)
|
|
|
|
|
|
|
|
seam_finder = cv.detail_GraphCutSeamFinder("COST_COLOR")
|
|
|
|
self.assertIsNotNone(seam_finder)
|
|
|
|
seam_finder = cv.detail_GraphCutSeamFinder("COST_COLOR_GRAD")
|
|
|
|
self.assertIsNotNone(seam_finder)
|
|
|
|
seam_finder = cv.detail_DpSeamFinder("COLOR")
|
|
|
|
self.assertIsNotNone(seam_finder)
|
|
|
|
seam_finder = cv.detail_DpSeamFinder("COLOR_GRAD")
|
|
|
|
self.assertIsNotNone(seam_finder)
|
|
|
|
|
|
|
|
blender = cv.detail.Blender_createDefault(cv.detail.Blender_NO)
|
|
|
|
self.assertIsNotNone(blender)
|
|
|
|
blender = cv.detail.Blender_createDefault(cv.detail.Blender_FEATHER)
|
|
|
|
self.assertIsNotNone(blender)
|
|
|
|
blender = cv.detail.Blender_createDefault(cv.detail.Blender_MULTI_BAND)
|
|
|
|
self.assertIsNotNone(blender)
|
|
|
|
|
|
|
|
timelapser = cv.detail.Timelapser_createDefault(cv.detail.Timelapser_AS_IS);
|
|
|
|
self.assertIsNotNone(timelapser)
|
|
|
|
timelapser = cv.detail.Timelapser_createDefault(cv.detail.Timelapser_CROP);
|
|
|
|
self.assertIsNotNone(timelapser)
|
|
|
|
|
|
|
|
|
|
|
|
class stitching_compose_panorama_test_no_args(NewOpenCVTests):
|
|
|
|
|
|
|
|
def test_simple(self):
|
|
|
|
|
|
|
|
img1 = self.get_sample('stitching/a1.png')
|
|
|
|
img2 = self.get_sample('stitching/a2.png')
|
|
|
|
|
|
|
|
stitcher = cv.Stitcher.create(cv.Stitcher_PANORAMA)
|
|
|
|
|
|
|
|
stitcher.estimateTransform((img1, img2))
|
|
|
|
|
|
|
|
result, _ = stitcher.composePanorama()
|
|
|
|
|
|
|
|
assert result == 0
|
|
|
|
|
|
|
|
|
|
|
|
class stitching_compose_panorama_args(NewOpenCVTests):
|
|
|
|
|
|
|
|
def test_simple(self):
|
|
|
|
|
|
|
|
img1 = self.get_sample('stitching/a1.png')
|
|
|
|
img2 = self.get_sample('stitching/a2.png')
|
|
|
|
|
|
|
|
stitcher = cv.Stitcher.create(cv.Stitcher_PANORAMA)
|
|
|
|
|
|
|
|
stitcher.estimateTransform((img1, img2))
|
|
|
|
result, _ = stitcher.composePanorama((img1, img2))
|
|
|
|
|
|
|
|
assert result == 0
|
|
|
|
|
|
|
|
|
|
|
|
class stitching_matches_info_test(NewOpenCVTests):
|
|
|
|
|
|
|
|
def test_simple(self):
|
|
|
|
finder = cv.ORB.create()
|
|
|
|
img1 = self.get_sample('stitching/a1.png')
|
|
|
|
img2 = self.get_sample('stitching/a2.png')
|
|
|
|
|
|
|
|
img_feat1 = cv.detail.computeImageFeatures2(finder, img1)
|
|
|
|
img_feat2 = cv.detail.computeImageFeatures2(finder, img2)
|
|
|
|
|
|
|
|
matcher = cv.detail.BestOf2NearestMatcher_create()
|
|
|
|
matches_info = matcher.apply(img_feat1, img_feat2)
|
|
|
|
|
|
|
|
self.assertIsNotNone(matches_info.matches)
|
|
|
|
self.assertIsNotNone(matches_info.inliers_mask)
|
|
|
|
|
|
|
|
class stitching_range_matcher_test(NewOpenCVTests):
|
|
|
|
|
|
|
|
def test_simple(self):
|
|
|
|
images = [
|
|
|
|
self.get_sample('stitching/a1.png'),
|
|
|
|
self.get_sample('stitching/a2.png'),
|
|
|
|
self.get_sample('stitching/a3.png')
|
|
|
|
]
|
|
|
|
|
|
|
|
orb = cv.ORB_create()
|
|
|
|
|
|
|
|
features = [cv.detail.computeImageFeatures2(orb, img) for img in images]
|
|
|
|
|
|
|
|
matcher = cv.detail_BestOf2NearestRangeMatcher(range_width=1)
|
|
|
|
matches = matcher.apply2(features)
|
|
|
|
|
|
|
|
# matches[1] is image 0 and image 1, should have non-zero confidence
|
|
|
|
self.assertNotEqual(matches[1].confidence, 0)
|
|
|
|
|
|
|
|
# matches[2] is image 0 and image 2, should have zero confidence due to range_width=1
|
|
|
|
self.assertEqual(matches[2].confidence, 0)
|
|
|
|
|
|
|
|
|
|
|
|
class stitching_seam_finder_graph_cuts(NewOpenCVTests):
|
|
|
|
|
|
|
|
def test_simple(self):
|
|
|
|
images = [
|
|
|
|
self.get_sample('stitching/a1.png'),
|
|
|
|
self.get_sample('stitching/a2.png'),
|
|
|
|
self.get_sample('stitching/a3.png')
|
|
|
|
]
|
|
|
|
|
|
|
|
images = [cv.resize(img, [100, 100]) for img in images]
|
|
|
|
|
|
|
|
finder = cv.detail_GraphCutSeamFinder('COST_COLOR_GRAD')
|
|
|
|
masks = [cv.UMat(255 * np.ones((img.shape[0], img.shape[1]), np.uint8)) for img in images]
|
|
|
|
images_f = [img.astype(np.float32) for img in images]
|
|
|
|
masks_warped = finder.find(images_f, [(0, 0), (75, 0), (150, 0)], masks)
|
|
|
|
|
|
|
|
self.assertIsNotNone(masks_warped)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
NewOpenCVTests.bootstrap()
|