使用Chessboard进行OpenCV转换

我刚刚开始尝试使用OpenCV。 我有一个静态位置的LCD设置,我想从图像中提取屏幕上显示的内容。 我已经看到用于校准相机的棋盘图案,但似乎用于不影响图像,这不完全是我想要做的。

我想我会在液晶显示屏上显示棋盘,然后找出将液晶显示屏的图像转换成直接在头顶和裁剪的棋盘理想视图所需的转换。 然后我会存储转换,更改LCD显示的内容,拍照,执行相同的转换,并获得现在显示的内容的理想视图。

我想知道这听起来是个好主意吗? 有没有更简单的方法来实现我想要做的事情? 关于函数的任何提示我应该用来计算转换,执行它们,存储它们(可能只是将转换矩阵保存在内存中或将它们写入文件)等等?

我不确定我是否理解了你想要做的一切,但请耐心等待。

有些相机的镜头会对图像造成一点失真,为此,OpenCV提供了一些方法来辅助相机校准过程 。

实际上,如果你想编写一个能够自动纠正图像失真的应用程序, 首先 ,你需要发现需要用来消除这种效果的神奇值 。 这些值来自适当的校准程序。

棋盘图像与应用程序一起用于校准相机 。 因此,在您获得相机设备拍摄的棋盘图像后,将此图像传递给校准应用程序。 该应用程序将识别方块的角落并计算失真的值,并返回您需要用来抵抗失真效果的神奇值。 此时,您对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

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