透视校正

来源:互联网 发布:淘宝爆款打造教程 编辑:程序博客网 时间:2024/06/10 10:19

#include "highgui.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main()

//把原来的彩色图像变成灰度图
IplImage* img_origion = cvLoadImage("7.JPG");
IplImage *img = cvCreateImage(cvGetSize(img_origion),IPL_DEPTH_8U,1);
cvCvtColor(img_origion, img, CV_BGR2GRAY);
IplImage *correct = cvCloneImage(img);
//设置cvGoodFeaturesToTrack函数所需的参数,并提取img的特征点
IplImage* img_temp = cvCreateImage(cvGetSize(img), 32, 1);
IplImage* img_eigen = cvCreateImage(cvGetSize(img), 32, 1);
int count = 1000;//the maximum numbers of points;
CvPoint2D32f* corners = new CvPoint2D32f[count];
cvGoodFeaturesToTrack(img, img_eigen, img_temp, corners, &count, 0.1, 10);
for (int i = 0; i<count; i++)
{
cvLine(img, cvPoint(corners[i].x, corners[i].y),cvPoint(corners[i].x, corners[i].y), CV_RGB(255, 0, 0), 5);
}
cvNamedWindow("Features"); cvShowImage("Features", img);
cvSaveImage("Features.JPG", img);
cout << "Total feature points :" << count << endl;


//把在特征点的6、21、2、17分别设为矩形的四个角
CvPoint2D32f src[4]; //存储源图像中四个特征点
CvPoint2D32f dst[4]; //目标图像中的四个点  
src[0].x = corners[6].x;
src[0].y = corners[6].y;
src[1].x = corners[21].x;
src[1].y = corners[21].y;
src[2].x = corners[2].x;
src[2].y = corners[2].y;
src[3].x = corners[17].x;
src[3].y = corners[17].y;


dst[0].x = 1;
dst[0].y = 1;
dst[1].x = 1;
dst[1].y = 480;
dst[2].x = 640;
dst[2].y = 1;
dst[3].x = 640;
dst[3].y = 480;
CvMat *warp_matrix = cvCreateMat(3, 3, CV_64FC1);//存放变换矩阵
cvGetPerspectiveTransform(src, dst, warp_matrix); //获得变换矩阵 


//尝试原图的一个像素点是否能转换到期望的位置,来验证透视矩阵的有效性
Mat sample = (Mat_<double>(3, 1) << 467, 410, 1); //样例点,目标图像的(640,480) 
Mat r = warp_matrix*sample;  //变换矩阵乘以样例点,得到结果点的其次坐标  
double s = r.at<double>(2, 0);  //归一化尺度  
cout << "\nresult...\n";
cout << ceil(r.at<double>(0, 0) / s) << endl;  //别忘了除以 s 哦
cout << ceil(r.at<double>(1, 0) / s) << endl;

//开始对原来图像进行透视校正,并显示结果;
cvWarpPerspective(img, correct, warp_matrix);
cvNamedWindow("correct");
cvShowImage("correct", correct);
cvSaveImage("correct.JPG", correct);

cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&img_origion);
cvReleaseImage(&correct);
cvReleaseImage(&img);
return  0;
}


0 0
原创粉丝点击