我想把棋盘格显示在LCD上,然后找出将LCD图像转换为垂直俯视和裁剪的理想视图所需的变换。然后我会存储这些变换,改变LCD的显示内容,拍照,执行相同的变换,获得现在显示内容的理想视图。
我想知道这听起来像个好主意吗?有更简单的方法实现我想做的事情吗?还有什么关于函数方面的建议,可以帮助我找到变换、执行变换、存储变换(也许只需将变换矩阵保存在内存中或写入文件)等?
我不确定我是否正确理解了你试图做的事情,但请耐心听我说。
有些相机的镜头会对图像造成一些畸变,为此 OpenCV 提供了方法来帮助进行相机校准过程。
实际上,如果你想编写一个能够自动纠正图像畸变的应用程序,首先,你需要找出需要使用的神奇值来撤销这种影响。这些值来自适当的校准过程。
chessboard image 与 用于校准相机的应用程序 一起使用。因此,在相机设备拍摄了棋盘图像后,将该图像传递给校准应用程序。该应用程序将识别方块的角落并计算畸变值,并返回您需要使用的神奇值以抵消畸变效果。此时,您对 calibrateCamera()
返回的2个变量感兴趣:它们是 cameraMatrix
和 distCoeffs
。打印它们,并将数据写在纸上。
最后,您正在开发的系统需要具有一个函数/方法来消除图像畸变,其中这两个变量将被硬编码在函数内,然后调用 cv::undistort()
(如果您正在使用OpenCV的C++ API):
cv::Mat undistorted;
cv::undistort(image, undistorted, cameraMatrix, distCoeffs);
就是这样。
自动检测旋转可能有点棘手,但首先要做的是找到您感兴趣的对象的坐标。但如果相机位置固定,这将很容易。
有关使用OpenCV进行透视变换和旋转的更多信息,请查看以下其他问题:
findhomography() 不是一个坏选择,但是倾斜和畸变(相机镜头)是真正的问题。
C++: Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
Python: cv2.findHomography(srcPoints, dstPoints[, method[, ransacReprojThreshold[, mask]]]) → retval, mask
C: void cvFindHomography(const CvMat* srcPoints, const CvMat* dstPoints, CvMat* H, int method=0, double ransacReprojThreshold=3, CvMat* status=NULL)