76 lines
3.4 KiB
Python
76 lines
3.4 KiB
Python
#!/usr/bin/env python
|
|
import os
|
|
import cv2 as cv
|
|
import numpy as np
|
|
|
|
from tests_common import NewOpenCVTests, unittest
|
|
|
|
def create_affine_transform_matrix(size,angle):
|
|
return np.array([[np.cos(angle), -np.sin(angle), size[1]/2], [np.sin(angle), np.cos(angle), 0]])
|
|
def create_perspective_transform_matrix(size,angle):
|
|
return np.vstack([create_affine_transform_matrix(size,angle),[0, 0, 1]])
|
|
|
|
class cudawarping_test(NewOpenCVTests):
|
|
def setUp(self):
|
|
super(cudawarping_test, self).setUp()
|
|
if not cv.cuda.getCudaEnabledDeviceCount():
|
|
self.skipTest("No CUDA-capable device is detected")
|
|
|
|
def test_resize(self):
|
|
dstSz = (256,256)
|
|
interp = cv.INTER_NEAREST
|
|
npMat = (np.random.random((128,128,3))*255).astype(np.uint8)
|
|
|
|
cuMat = cv.cuda_GpuMat(npMat)
|
|
cuMatDst = cv.cuda_GpuMat(dstSz,cuMat.type())
|
|
|
|
self.assertTrue(np.allclose(cv.cuda.resize(cuMat,dstSz,interpolation=interp).download(),
|
|
cv.resize(npMat,dstSz,interpolation=interp)))
|
|
|
|
cv.cuda.resize(cuMat,dstSz,cuMatDst,interpolation=interp)
|
|
self.assertTrue(np.allclose(cuMatDst.download(),cv.resize(npMat,dstSz,interpolation=interp)))
|
|
|
|
def test_warp(self):
|
|
npMat = (np.random.random((128,128,3))*255).astype(np.uint8)
|
|
size = npMat.shape[:2]
|
|
M1 = create_affine_transform_matrix(size,np.pi/2)
|
|
|
|
cuMat = cv.cuda_GpuMat(npMat)
|
|
cuMatDst = cv.cuda_GpuMat(size,cuMat.type())
|
|
|
|
borderType = cv.BORDER_REFLECT101
|
|
self.assertTrue(np.allclose(cv.cuda.warpAffine(cuMat,M1,size,borderMode=borderType).download(),
|
|
cv.warpAffine(npMat,M1,size, borderMode=borderType)))
|
|
cv.cuda.warpAffine(cuMat,M1,size,cuMatDst,borderMode=borderType)
|
|
self.assertTrue(np.allclose(cuMatDst.download(),cv.warpAffine(npMat,M1,size,borderMode=borderType)))
|
|
|
|
interpolation = cv.INTER_NEAREST
|
|
flags = interpolation | cv.WARP_INVERSE_MAP
|
|
dst_gold = cv.warpAffine(npMat, M1, size, flags = flags)
|
|
cuMaps = cv.cuda.buildWarpAffineMaps(M1,True,size)
|
|
dst = cv.remap(npMat, cuMaps[0].download(), cuMaps[1].download(),interpolation)
|
|
self.assertTrue(np.allclose(dst,dst_gold))
|
|
|
|
xmap = cv.cuda_GpuMat(size,cv.CV_32FC1)
|
|
ymap = cv.cuda_GpuMat(size,cv.CV_32FC1)
|
|
cv.cuda.buildWarpAffineMaps(M1,True,size,xmap,ymap)
|
|
dst = cv.remap(npMat, xmap.download(), ymap.download(),interpolation)
|
|
self.assertTrue(np.allclose(dst,dst_gold))
|
|
|
|
M2 = create_perspective_transform_matrix(size,np.pi/2)
|
|
np.allclose(cv.cuda.warpPerspective(cuMat,M2,size,borderMode=borderType).download(),
|
|
cv.warpPerspective(npMat,M2,size,borderMode=borderType))
|
|
cv.cuda.warpPerspective(cuMat,M2,size,cuMatDst,borderMode=borderType)
|
|
self.assertTrue(np.allclose(cuMatDst.download(),cv.warpPerspective(npMat,M2,size,borderMode=borderType)))
|
|
|
|
dst_gold = cv.warpPerspective(npMat, M2, size, flags = flags)
|
|
cuMaps = cv.cuda.buildWarpPerspectiveMaps(M2,True,size)
|
|
dst = cv.remap(npMat, cuMaps[0].download(), cuMaps[1].download(),interpolation)
|
|
self.assertTrue(np.allclose(dst,dst_gold))
|
|
|
|
cv.cuda.buildWarpPerspectiveMaps(M2,True,size,xmap,ymap)
|
|
dst = cv.remap(npMat, xmap.download(), ymap.download(),interpolation)
|
|
self.assertTrue(np.allclose(dst,dst_gold))
|
|
|
|
if __name__ == '__main__':
|
|
NewOpenCVTests.bootstrap() |