OpenCV使用棋盘格进行变换

8
我只是刚开始尝试使用OpenCV。我有一个固定位置的LCD设置,想从图像中提取屏幕上显示的内容。我曾经见过棋盘格图案用于相机校准,但似乎那是用来消除图像畸变,这并不完全是我想做的。
我想把棋盘格显示在LCD上,然后找出将LCD图像转换为垂直俯视和裁剪的理想视图所需的变换。然后我会存储这些变换,改变LCD的显示内容,拍照,执行相同的变换,获得现在显示内容的理想视图。
我想知道这听起来像个好主意吗?有更简单的方法实现我想做的事情吗?还有什么关于函数方面的建议,可以帮助我找到变换、执行变换、存储变换(也许只需将变换矩阵保存在内存中或写入文件)等?

如果您分享用于测试的图像,将会非常有帮助。棋盘格模式用于相机校准,旨在消除相机镜头引起的畸变。一旦您获得了校准值,就可以将这些值硬编码到应用程序中的过程中,以便自动进行校准 - karlphillip
我没有图片,但想象一下在Photoshop中绘制一个国际象棋棋盘。然后将其进行旋转,并从微小的透视角度进行查看。我希望通过使用棋盘校准来消除相机畸变,但我也想知道是否可以利用棋盘来确定撤销旋转和透视所需的变换。 - kevin.key
我想这个问题现在已经被回答了,可能是通过下面的帖子之一或者你找到了不同的方法。 - karlphillip
2个回答

18

我不确定我是否正确理解了你试图做的事情,但请耐心听我说。

有些相机的镜头会对图像造成一些畸变,为此 OpenCV 提供了方法来帮助进行相机校准过程

实际上,如果你想编写一个能够自动纠正图像畸变的应用程序,首先,你需要找出需要使用的神奇值来撤销这种影响。这些值来自适当的校准过程。

chessboard image用于校准相机的应用程序 一起使用。因此,在相机设备拍摄了棋盘图像后,将该图像传递给校准应用程序。该应用程序将识别方块的角落并计算畸变值,并返回您需要使用的神奇值以抵消畸变效果。此时,您对 calibrateCamera() 返回的2个变量感兴趣:它们是 cameraMatrixdistCoeffs。打印它们,并将数据写在纸上。

最后,您正在开发的系统需要具有一个函数/方法来消除图像畸变,其中这两个变量将被硬编码在函数内,然后调用 cv::undistort()(如果您正在使用OpenCV的C++ API):

cv::Mat undistorted;
cv::undistort(image, undistorted, cameraMatrix, distCoeffs);

就是这样。

自动检测旋转可能有点棘手,但首先要做的是找到您感兴趣的对象的坐标。但如果相机位置固定,这将很容易。

有关使用OpenCV进行透视变换和旋转的更多信息,请查看以下其他问题:

在一组cv::Point上执行cv :: warpPerspective进行虚拟去扭曲

仿射变换,简单旋转和缩放或完全不同的东西?

使用cv :: warpAffine偏移目标图像旋转cv :: Mat


好的,我更新了答案,并附上了一些链接,你可能会觉得有趣,它们可能会帮助你实现你想要的。 - karlphillip
并不完全是这样。在进行了去畸变之后,图像仍然会看起来像这样:[链接](http://www.thechesszone.com/images/chess-boards-leather/TCZ_204GN_1.jpg)它的角度不会那么极端,但我指的是旋转和透视。所以我考虑使用`cvFindChessboardCorners`函数获得的角落计算出变换矩阵,使棋盘直接置于正上方:[链接]( http://images.bibliocad.com/library/image/00020000/0000/chess-board_20342.gif),然后将这些相同的变换应用于随后的图像。 - kevin.key
抱歉,让我看看你提到的其他链接。 - kevin.key
另一方面,你可以检测整个棋盘,并使用简单的 warpPerspective() 函数来实现这种效果,就像 这里 所示。这对你有用吗? - karlphillip
棋盘看起来像一个矩形,你不同意吗?看一下OpenCV的名为“squares”的示例。它展示了如何仅检测那个形状。可能需要一些微调以适应你的情况,但是你会得到灵感的。 - karlphillip

-1

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)

http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findhomography


以上链接无法访问。 - ajayramesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接