opencv学习笔记(五)重映射及仿射变换

重映射

    cv::Mat src = cv::imread("1.jpg");
    if (!src.data)
    {
        cout << "error" << endl;
        return -1;
    }
    cv::Mat dst,map_x,map_y;
    //创建和原始图一样的效果图,x重映射图,y重映射图
    dst.create(src.size(), src.type());
    map_x.create(src.size(), CV_32FC1);
    map_y.create(src.size(), CV_32FC1);
    //双层循环,遍历每一个像素点,改变map_x&map_y的值
    for (int j = 0; j < src.rows; j++)
    {
        for (int i = 0; i < src.cols; i++)
        {
            // 改变map_x&map_y的值
            map_x.at<float>(j, i) = static_cast<float>(i);
            map_y.at<float>(j, i) = static_cast<float>(src.rows - j);
        }
    }
    //进行重映射操作
    remap(src,//输入图像,需为单通道8位或浮点型图像
          dst, //输出图像
          map_x, //表示点(x,y)的第一个映射或表示CV_16SC2、CV_32FC1或CV_32FC2类型的X值
          map_y, //表示CV_16UC1、CV_32FC1类型的Y值
          CV_INTER_LINEAR, //插值方式
          cv::BORDER_CONSTANT); //边界模式
    cv::imshow("原图", src);
    cv::imshow("remap 效果图", dst);

仿射变换

    cv::Mat src = cv::imread("1.jpg");
    if (!src.data)
    {
        cout << "error" << endl;
        return -1;
    }
    //定义两组点,代表两个三角形
    cv::Point2f srcTriangle[3];
    cv::Point2f dstTriangle[3];
    //定义一些Mat变量
    cv::Mat rotMat(2, 3, CV_32FC1);
    cv::Mat warpMat(2, 3, CV_32FC1);
    cv::Mat dstImage_warp, dstImage_warp_rotate;
    dstImage_warp = cv::Mat::zeros(src.rows, src.cols, src.type());
    //设置源图像和目标图像上的三组点以计算仿射变换
    srcTriangle[0] = cv::Point2f(0, 0);
    srcTriangle[1] = cv::Point2f(static_cast<float>(src.cols - 1), 0);
    srcTriangle[2] = cv::Point2f(0, static_cast<float>(src.rows - 1));
    dstTriangle[0] = cv::Point2f(static_cast<float>(src.cols*0.0), static_cast<float>(src.rows*0.33));
    dstTriangle[1] = cv::Point2f(static_cast<float>(src.cols*0.65), static_cast<float>(src.rows*0.35));
    dstTriangle[2] = cv::Point2f(static_cast<float>(src.cols*0.15), static_cast<float>(src.rows*0.6));
    //求得仿射变换
    warpMat = cv::getAffineTransform(srcTriangle, dstTriangle);
    //对源图像应用刚刚求得的仿射变换
    cv::warpAffine(src, //输入图像
                   dstImage_warp, //输出图像
                   warpMat, //2*3的变换矩阵
                   dstImage_warp.size());//输出图像的尺寸,默认为线性插值
    //对图像进行缩放后再旋转
    // 计算绕图像中点顺时针旋转50度缩放因子为0.6的旋转矩阵
    cv::Point center = cv::Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);
    double angle = -50.0;
    double scale = 0.6;
    // 通过上面的旋转细节信息求得旋转矩阵
    rotMat = getRotationMatrix2D(center, angle, scale);
    // 旋转已缩放后的图像
    cv::warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());
    cv::imshow("原图", src);
    cv::imshow("Warp 效果图", dstImage_warp);
    cv::imshow("Warp和Rotate 效果图", dstImage_warp_rotate);

猜你喜欢

转载自blog.csdn.net/xuxunjie147/article/details/78294571