我刚刚开始尝试使用OpenCV。我有一个静态位置的LCD设置,我想从图像中提取屏幕上显示的内容。我已经看到用于校准相机的棋盘图案,但似乎这用于不影响图像,这不完全是我想做的。
我在想我会在液晶显示屏上显示棋盘,然后找出将液晶显示屏的图像转换为直接在头顶和裁剪的棋盘理想视图所需的转换。然后我会存储转换,更改LCD显示的内容,拍照,执行相同的转换,并获得现在正在显示的内容的理想视图。
我想知道这听起来是个好主意吗?有没有更简单的方法来实现我想要做的事情?关于函数的任何提示我应该用来计算转换,执行它们,存储它们(可能只是将转换矩阵保存在内存中或将它们写入文件中)等等?
答案 0 :(得分:17)
我不确定我是否理解了你想要做的一切,但请耐心等待。
有些相机的镜头会对图像造成一点失真,为此,OpenCV提供的方法有助于camera calibration process。
实际上,如果你想编写一个能够自动纠正图像失真的应用程序,首先,你需要发现需要什么的神奇值用于撤消此效果。这些值来自适当的校准程序。
chessboard image与application to calibrate the camera一起使用。因此,在您拥有相机设备拍摄的棋盘图像后,将此图像传递给校准应用程序。该应用程序将识别方块的角落并计算失真的值,并返回您需要用来抵抗失真效果的神奇值。此时,您对calibrateCamera()
返回的2个变量感兴趣:它们是cameraMatrix
和distCoeffs
。打印它们,并将数据写在一张纸上。
最后,您正在开发的系统需要有一个函数/方法来取消图像的失真,这两个变量将在函数内部进行硬编码,然后调用cv::undistort()
(如果你是使用OpenCV的C ++ API:
cv::Mat undistorted;
cv::undistort(image, undistorted, cameraMatrix, distCoeffs);
就是这样。
自动检测旋转可能有点棘手,但首先要做的是找到您感兴趣的物体的坐标。但如果相机处于固定位置,这将很容易。
有关使用OpenCV进行透视更改和轮换的更多信息,我建议您查看以下其他问题:
Executing cv::warpPerspective for a fake deskewing on a set of cv::Point
Affine Transform, Simple Rotation and Scaling or something else entirely?
Rotate cv::Mat using cv::warpAffine offsets destination image
答案 1 :(得分:0)
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方法= 0,双ransacReprojThreshold = 3, CvMat * status = NULL)