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

来源:互联网 发布:最好的播放器 知乎 编辑:程序博客网 时间:2024/05/29 03:18

重映射

    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);
阅读全文
0 0