findHomography
来获取两个点集之间的变换。我想限制变换中使用的自由度,因此想要用 estimateRigidTransform
替换 findHomography
。
下面我使用estimateRigidTransform
来获取物体和场景点之间的变换。objPoints
和scePoints
由vector <Point2f>
表示。Mat H = estimateRigidTransform(objPoints, scePoints, false);
按照上面教程中的方法,我想使用变换H
来改变角落的值。该教程使用findHomography
返回的3x3矩阵与perspectiveTransform
一起使用。对于刚性变换,它只返回一个2x3矩阵,所以不能使用这种方法。
如何使用这个2x3矩阵转换表示为vector <Point2f>
的角落值。我只是想执行与教程相同的功能,但变换的自由度较少。我也尝试了其他方法,如warpAffine
和getPerspectiveTransform
,但迄今为止没有找到解决方案。
编辑:
我尝试了David Nilosek的建议。下面我将额外的行添加到矩阵中。
Mat row = (Mat_<double>(1,3) << 0, 0, 1);
H.push_back(row);
然而,当使用perspectiveTransform时会出现此错误。
OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create, file /Users/cgray/Downloads/opencv-2.4.6/modules/core/src/matrix.cpp, line 1486
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/cgray/Downloads/opencv-2.4.6/modules/core/src/matrix.cpp:1486: error: (-215) mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) in function create
ChronoTrigger建议使用warpAffine
。我在下面调用了warpAffine
方法,1 x 5的大小是objCorners
和sceCorners
的大小。
warpAffine(objCorners, sceCorners, H, Size(1,4));
这导致了下面的错误,表明类型错误。
objCorners
和 sceCorners
是表示4个角落的vector <Point2f>
。 我以为 warpAffine
会接受可能会解释错误的Mat
图像。OpenCV Error: Assertion failed ((M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 2 && M0.cols == 3) in warpAffine, file /Users/cgray/Downloads/opencv-2.4.6/modules/imgproc/src/imgwarp.cpp, line 3280
result.x = a.x*transf.at<double>(0,0) + a.y*transf.at<double>(0,1) + transf.at<double>(0,3); result.y = ...
这是标准矩阵乘法。我发现这比一些点到矩阵转换更少出错。 - Micka