void OpenCV_Function::warpAffine() { //【1】参数准备 //定义两组点,代表两个三角形 cv::Point2f srcTriangle[3]; cv::Point2f dstTriangle[3]; //定义一些Mat变量 cv::Mat rotMat( 2, 3, CV_32FC1 ); cv::Mat warpMat( 2, 3, CV_32FC1 ); //【2】加载源图像并作一些初始化 g_srcImage=cv::imread("girl-t1.jpg"); // 设置目标图像的大小和类型与源图像一致 g_resultImage = cv::Mat::zeros( g_srcImage.rows, g_srcImage.cols, g_srcImage.type() ); //【3】设置源图像和目标图像上的三组点以计算仿射变换 srcTriangle[0] = cv::Point2f( 0,0 ); srcTriangle[1] = cv::Point2f( static_cast<float>(g_srcImage.cols - 1), 0 ); srcTriangle[2] = cv::Point2f( 0, static_cast<float>(g_srcImage.rows - 1 )); dstTriangle[0] = cv::Point2f( static_cast<float>(g_srcImage.cols*0.0), static_cast<float>(g_srcImage.rows*0.33)); dstTriangle[1] = cv::Point2f( static_cast<float>(g_srcImage.cols*0.65), static_cast<float>(g_srcImage.rows*0.35)); dstTriangle[2] = cv::Point2f( static_cast<float>(g_srcImage.cols*0.15), static_cast<float>(g_srcImage.rows*0.6)); //【4】求得仿射变换 warpMat = getAffineTransform( srcTriangle, dstTriangle ); //【5】对源图像应用刚刚求得的仿射变换 cv::warpAffine( g_srcImage, g_resultImage, warpMat, g_resultImage.size() ); //【6】对图像进行缩放后再旋转 cv::Point center = cv::Point( g_srcImage.cols/2, g_srcImage.rows/2 ); double angle = -20.0; double scale = 1; // 通过上面的旋转细节信息求得旋转矩阵 rotMat =cv::getRotationMatrix2D( center, angle, scale ); // 旋转已缩放后的图像 cv::warpAffine( g_resultImage, g_templateImage, rotMat, g_resultImage.size() ); cv::imshow("【原始图】",g_srcImage); cv::imshow( "g_templateImage", g_templateImage ); cv::imshow( "g_resultImage", g_resultImage ); }
PERF_TEST_P( TestWarpPerspective, WarpPerspective, Combine( Values( szVGA, sz720p, sz1080p ), InterType::all(), BorderMode::all() ) ) { Size sz, szSrc(512, 512); int borderMode, interType; sz = get<0>(GetParam()); interType = get<1>(GetParam()); borderMode = get<2>(GetParam()); Scalar borderColor = Scalar::all(150); Mat src(szSrc,CV_8UC4), dst(sz, CV_8UC4); cvtest::fillGradient(src); if(borderMode == BORDER_CONSTANT) cvtest::smoothBorder(src, borderColor, 1); Mat rotMat = getRotationMatrix2D(Point2f(src.cols/2.f, src.rows/2.f), 30., 2.2); Mat warpMat(3, 3, CV_64FC1); for(int r=0; r<2; r++) for(int c=0; c<3; c++) warpMat.at<double>(r, c) = rotMat.at<double>(r, c); warpMat.at<double>(2, 0) = .3/sz.width; warpMat.at<double>(2, 1) = .3/sz.height; warpMat.at<double>(2, 2) = 1; declare.in(src).out(dst); TEST_CYCLE() warpPerspective( src, dst, warpMat, sz, interType, borderMode, borderColor ); #ifdef __ANDROID__ SANITY_CHECK(dst, interType==INTER_LINEAR? 5 : 10); #else SANITY_CHECK(dst, 1); #endif }