o2co2 发表于 2012-8-8 17:29:31

[OpenCV2.4]图像变换之三点变换指定矩阵变换

我的博客:http://zwmin.com

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int
main(int argc, char *argv[])
{
cv::Mat src_img = cv::imread("../../image/lenna.png", 1);
if(src_img.empty()) return -1;// 变换前三点
const cv::Point2f src_pt[] = { cv::Point2f(200, 200), cv::Point2f(250, 200), cv::Point2f(200, 100) };
// 变换后三点
const cv::Point2f dst_pt[] = { cv::Point2f(300, 100), cv::Point2f(300, 50), cv::Point2f(200, 100) };
// 通过三点的变换计算矩阵的变换
const cv::Mat affine_matrix = cv::getAffineTransform(src_pt, dst_pt);std::cout << "affine_matrix=\n" << affine_matrix << std::endl;cv::Mat dst_img;
cv::warpAffine(src_img, dst_img, affine_matrix, src_img.size());// 画出变换前后的三点连线
cv::line(src_img, src_pt[0], src_pt[1], cv::Scalar(255,255,0), 2);
cv::line(src_img, src_pt[1], src_pt[2], cv::Scalar(255,255,0), 2);
cv::line(src_img, src_pt[2], src_pt[0], cv::Scalar(255,255,0), 2);
cv::line(src_img, dst_pt[0], dst_pt[1], cv::Scalar(255,0,255), 2);
cv::line(src_img, dst_pt[1], dst_pt[2], cv::Scalar(255,0,255), 2);
cv::line(src_img, dst_pt[2], dst_pt[0], cv::Scalar(255,0,255), 2);cv::namedWindow("src", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::namedWindow("dst", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::imshow("src", src_img);
cv::imshow("dst", dst_img);
cv::waitKey(0);
}
输入画像:http://zwmin.com/wp-content/uploads/2012/08/wpid-fe1608b344b3612199f3a45ffff353f0_lenna1.png
输出结果:http://zwmin.com/wp-content/uploads/2012/08/wpid-fe1608b344b3612199f3a45ffff353f0_lenna_affine_3points_input1.png http://zwmin.com/wp-content/uploads/2012/08/wpid-fe1608b344b3612199f3a45ffff353f0_lenna_affine_3points1.png
affine_matrix=
[0, 1, 100;
-1, -3.255497723249808e-17, 300.0000000000001]



页: [1]
查看完整版本: [OpenCV2.4]图像变换之三点变换指定矩阵变换