Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/python/test/test_umat.py
16337 views
1
#!/usr/bin/env python
2
from __future__ import print_function
3
4
import numpy as np
5
import cv2 as cv
6
7
from tests_common import NewOpenCVTests
8
9
class UMat(NewOpenCVTests):
10
11
def test_umat_construct(self):
12
data = np.random.random([512, 512])
13
# UMat constructors
14
data_um = cv.UMat(data) # from ndarray
15
data_sub_um = cv.UMat(data_um, (128, 256), (128, 256)) # from UMat
16
data_dst_um = cv.UMat(128, 128, cv.CV_64F) # from size/type
17
# test continuous and submatrix flags
18
assert data_um.isContinuous() and not data_um.isSubmatrix()
19
assert not data_sub_um.isContinuous() and data_sub_um.isSubmatrix()
20
# test operation on submatrix
21
cv.multiply(data_sub_um, 2., dst=data_dst_um)
22
assert np.allclose(2. * data[128:256, 128:256], data_dst_um.get())
23
24
def test_umat_handle(self):
25
a_um = cv.UMat(256, 256, cv.CV_32F)
26
_ctx_handle = cv.UMat.context() # obtain context handle
27
_queue_handle = cv.UMat.queue() # obtain queue handle
28
_a_handle = a_um.handle(cv.ACCESS_READ) # obtain buffer handle
29
_offset = a_um.offset # obtain buffer offset
30
31
def test_umat_matching(self):
32
img1 = self.get_sample("samples/data/right01.jpg")
33
img2 = self.get_sample("samples/data/right02.jpg")
34
35
orb = cv.ORB_create()
36
37
img1, img2 = cv.UMat(img1), cv.UMat(img2)
38
ps1, descs_umat1 = orb.detectAndCompute(img1, None)
39
ps2, descs_umat2 = orb.detectAndCompute(img2, None)
40
41
self.assertIsInstance(descs_umat1, cv.UMat)
42
self.assertIsInstance(descs_umat2, cv.UMat)
43
self.assertGreater(len(ps1), 0)
44
self.assertGreater(len(ps2), 0)
45
46
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
47
48
res_umats = bf.match(descs_umat1, descs_umat2)
49
res = bf.match(descs_umat1.get(), descs_umat2.get())
50
51
self.assertGreater(len(res), 0)
52
self.assertEqual(len(res_umats), len(res))
53
54
def test_umat_optical_flow(self):
55
img1 = self.get_sample("samples/data/right01.jpg", cv.IMREAD_GRAYSCALE)
56
img2 = self.get_sample("samples/data/right02.jpg", cv.IMREAD_GRAYSCALE)
57
# Note, that if you want to see performance boost by OCL implementation - you need enough data
58
# For example you can increase maxCorners param to 10000 and increase img1 and img2 in such way:
59
# img = np.hstack([np.vstack([img] * 6)] * 6)
60
61
feature_params = dict(maxCorners=239,
62
qualityLevel=0.3,
63
minDistance=7,
64
blockSize=7)
65
66
p0 = cv.goodFeaturesToTrack(img1, mask=None, **feature_params)
67
p0_umat = cv.goodFeaturesToTrack(cv.UMat(img1), mask=None, **feature_params)
68
self.assertEqual(p0_umat.get().shape, p0.shape)
69
70
p0 = np.array(sorted(p0, key=lambda p: tuple(p[0])))
71
p0_umat = cv.UMat(np.array(sorted(p0_umat.get(), key=lambda p: tuple(p[0]))))
72
self.assertTrue(np.allclose(p0_umat.get(), p0))
73
74
_p1_mask_err = cv.calcOpticalFlowPyrLK(img1, img2, p0, None)
75
76
_p1_mask_err_umat0 = list(map(lambda umat: umat.get(), cv.calcOpticalFlowPyrLK(img1, img2, p0_umat, None)))
77
_p1_mask_err_umat1 = list(map(lambda umat: umat.get(), cv.calcOpticalFlowPyrLK(cv.UMat(img1), img2, p0_umat, None)))
78
_p1_mask_err_umat2 = list(map(lambda umat: umat.get(), cv.calcOpticalFlowPyrLK(img1, cv.UMat(img2), p0_umat, None)))
79
80
for _p1_mask_err_umat in [_p1_mask_err_umat0, _p1_mask_err_umat1, _p1_mask_err_umat2]:
81
for data, data_umat in zip(_p1_mask_err, _p1_mask_err_umat):
82
self.assertEqual(data.shape, data_umat.shape)
83
self.assertEqual(data.dtype, data_umat.dtype)
84
for _p1_mask_err_umat in [_p1_mask_err_umat1, _p1_mask_err_umat2]:
85
for data_umat0, data_umat in zip(_p1_mask_err_umat0[:2], _p1_mask_err_umat[:2]):
86
self.assertTrue(np.allclose(data_umat0, data_umat))
87
88
if __name__ == '__main__':
89
NewOpenCVTests.bootstrap()
90
91