コード例 #1
0
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 );  
}  
コード例 #2
0
ファイル: perf_warp.cpp プロジェクト: AutomanHan/opencv
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
}