我不知道什么标题能正确描述我的问题,我希望这个标题不会令人困惑。
几天前,我开始了我的 OpenCV 冒险之旅。直到今天,我还是设法在我的网络摄像头的直播中找到了一个棋盘,并在上面显示了一个调整大小的图像。我的下一个目标是让程序在我旋转棋盘时旋转图像。不幸的是,我不知道该怎么做,我看到了很多代码,很多例子,但没有一个有帮助。我的最后一个目标是做这样的事情:http ://www.youtube.com/watch?v=APxgPYZOd0I (我无法从他的代码中得到任何东西,他使用 Qt,我只遇到过一次,我不是对它感兴趣——但是)。
这是我的代码:
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
vector<Point3f> Create3DChessboardCorners(Size boardSize, float squareSize);
int main(int argc, char* argv[])
{
Size boardSize(6,9);
float squareSize=1.f;
namedWindow("Viewer");
namedWindow("zdjecie");
namedWindow("changed");
Mat zdjecie=imread("D:\\Studia\\Programy\\cvTest\\Debug\\przyklad.JPG");
resize(zdjecie, zdjecie, Size(200,150));
Mat changed=Mat(zdjecie);
imshow("zdjecie", changed);
vector<Point2f> corners;
VideoCapture video(0);
cout<<"video height: "<<video.get(CV_CAP_PROP_FRAME_HEIGHT)<<endl;
cout<<"video width: "<<video.get(CV_CAP_PROP_FRAME_WIDTH)<<endl;
Mat frame;
bool found;
Point2f src[4];
Point2f dst[4];
Mat perspMat;
while(1)
{
video>>frame;
found=findChessboardCorners(frame, boardSize, corners, CALIB_CB_FAST_CHECK);
changed=Mat(zdjecie);
// drawChessboardCorners(frame, boardSize, Mat(corners), found);
if(found)
{
line(frame, corners[0], corners[5], Scalar(0,0,255));
line(frame, corners[0], corners[48], Scalar(0,0,255));
src[0].x=0;
src[0].y=0;
src[1].x=zdjecie.cols;
src[1].y=0;
src[2].x=zdjecie.cols;
src[2].y=zdjecie.rows;
src[3].x=0;
src[3].y=zdjecie.rows;
dst[0].x=corners[0].x;
dst[0].y=corners[0].y;
dst[1].x=corners[boardSize.width-1].x;
dst[1].y=corners[boardSize.width-1].y;
dst[2].x=corners[boardSize.width*boardSize.height-1].x;
dst[2].x=corners[boardSize.width*boardSize.height-1].y;
dst[3].x=corners[boardSize.width*(boardSize.height-1)].x;
dst[3].y=corners[boardSize.width*(boardSize.height-1)].y;
perspMat=getPerspectiveTransform(src, dst);
warpPerspective(zdjecie, changed, perspMat, frame.size());
}
imshow("changed", changed);
imshow("Viewer", frame);
if(waitKey(20)!=-1)
break;
}
return 0;
}
我试图理解这段代码:http ://dsynflo.blogspot.com/2010/06/simplar-augmented-reality-for-opencv.html 但没有任何帮助。它甚至对我不起作用——来自我的网络摄像头的图像是倒置的,帧每隔几秒钟就会改变一次,什么都没有显示。
所以我要求的不是一个完整的解决方案。如果有人向我解释如何做到这一点,我会很高兴。我想从基础上理解它,我现在不知道该去哪里。我花了很多时间试图解决它,如果我没有,我不会用我的问题来打扰你。
我期待着你的答案!
问候,丹尼尔
编辑:我更改了代码。现在您可以看到我如何尝试扭曲图像的透视图。首先我认为调用warpPerspective函数后我的图像Mat改变(它是Mat krzywe,我改变了它的名字,所以它不会混淆)是黑色的原因是我每次都没有从基本照片开始扭曲透视图. 所以我添加了行 changed=Mat(zdjecie)
我想我的问题很容易解决,但我现在真的不知道。