单应性矩阵的应用——替代广告牌

最近看了篇文章,讲述的是单应性矩阵Homography matrix的理解与应用,尝试着运行文章中的代码时发现总是报异常。目前水平尚属于初级阶段的我花了一个下午的时间,还请了外援,现在终于解决了。
遇到的问题如下图所示。
这里写图片描述
将点由Point改为Point2f后这个问题得到了解决。
其他一些可能由于原作者手误敲错代码而引起的问题这里就不再提出。下面是改正后可运行的代码。

#include <opencv2\opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

void main()
{
    //读入广告图
    Mat src = imread("timg2.jpg");
    if (!src.data)
    {
        cout << "could not loag image..." << endl;
    }
    namedWindow("input image", CV_WINDOW_FREERATIO);
    imshow("input image", src);

    //读入用来替代广告图中某一广告牌的图片
    Mat replaceImg = imread("1.jpg");
    if (!replaceImg.data)
    {
        cout << "could not loag image..." << endl;
    }
    namedWindow("adv content", CV_WINDOW_FREERATIO);
    imshow("adv content", replaceImg);


    vector<Point2f> src_corners(4);
    vector<Point2f> dst_corners(4);
    //用来替换某一广告牌的图片四角坐标
    src_corners[0]=Point2f(0.0, 0.0);
    src_corners[1]=Point2f(replaceImg.cols, 0.0);
    src_corners[2]=Point2f(0.0, replaceImg.rows);
    src_corners[3]=Point2f(replaceImg.cols, replaceImg.rows);

    //广告图中被替代广告牌的四角坐标
    dst_corners[0] = Point2f(786, 517);
    dst_corners[1] = Point2f(1018, 395);
    dst_corners[2] = Point2f(799, 658);
    dst_corners[3] = Point2f(1053, 605);

    //计算单应性矩阵
    Mat h = findHomography(src_corners, dst_corners);
    //将用来替换广告牌的图像进行形状视角变换
    Mat output_img;
    warpPerspective(replaceImg, output_img, h, src.size());

    //求掩膜
    Mat m1 = Mat::zeros(replaceImg.size(), CV_8UC1);
    m1 = Scalar(255);
    Mat mask_output;
    warpPerspective(m1, mask_output, h, src.size());
    namedWindow("Mask Result", CV_WINDOW_FREERATIO);
    imshow("Mask Result", mask_output);

    //得到最终的结果并保存
    Mat result1;
    add(output_img, output_img, result1, mask_output);
    Mat result2;
    bitwise_not(mask_output, mask_output);
    add(src, result1, result2,mask_output);
    Mat result;
    add(output_img, result2, result); 
    namedWindow("Final result", CV_WINDOW_FREERATIO);
    imshow("Final result", result); 
    imwrite("result.png", result);

    waitKey(0);
}

输入的广告图如下:
这里写图片描述
被用来替换广告图中某一广告牌的图像如下:
这里写图片描述
最终的替换效果图如下:
这里写图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单应性矩阵也被称为单应性变换矩阵,是指一个平面上的点通过一个矩阵变换后,被映射到另一个平面上的点。在Matlab中,可以通过使用homography函数来求解单应性矩阵。 具体步骤如下: 1.准备待变换的点集。在Matlab中,可以通过使用ginput函数在图像上手动选择需要变换的点集。 2.通过使用findHomography函数来计算单应性矩阵。该函数需要输入两个点集,分别是待变换的点集和变换后的点集。 3.输出单应性矩阵。findHomography函数将会输出一个3x3的矩阵,即单应性矩阵。 需要注意的是,单应性矩阵通常通过二维点集之间的对应关系来求解。因此,在选择点集时,需要确保两个点集中的点数相同,并且在相应的位置上是一一对应的。 另外,由于单应性矩阵的求解涉及到矩阵运算,因此在实际应用中可能存在数值计算误差。为了减小误差,可以尝试使用更为精确的数值计算方法,比如SVD分解等。 ### 回答2: 在计算机视觉领域中,单应性矩阵是指两个平面上的点集之间的一种变换关系。在MATLAB中,求解单应性矩阵可以使用HOMOG函数。 使用HOMOG函数,需要输入两个平面上的点集,其中第一组点为原图像上的点,第二组点为目标图像上对应的点。例如: ```matlab points1 = [16 20; 28 46; 234 36; 222 254]; points2 = [17 22; 29 49; 236 35; 223 257]; H = homog(points1, points2) ``` 这里,我们定义了两个点集`points1`和`points2`,然后使用HOMOG函数求解单应性矩阵,并将结果存储在变量H中。 在MATLAB中,HOMOG函数可以通过“Computer Vision Toolbox”获得。如果没有安装此工具箱,可通过以下命令进行安装: ```matlab matlab.addons.toolbox.install('computer-vision') ``` 此命令将从MATLAB Add-Ons库中下载和安装此工具箱。 总之,在MATLAB中求解单应性矩阵可以使用HOMOG函数,需要提供两个平面上的对应点集。 ### 回答3: 单应性矩阵是一种用于计算图像变形的矩阵,通常用于计算摄影和计算机视觉中的问题。MATLAB是一个强大的科学计算软件,可以用来求解单应性矩阵。下面是求解单应性矩阵的步骤: 首先,需要获取两幅图像上的对应点,这些点应该具有一一对应关系。 接下来,需要使用这些对应点来计算单应性矩阵。MATLAB中可以使用“estimateGeometricTransform”函数来计算单应性矩阵。该函数的输入参数包括对应点的坐标和单应性矩阵的类型。输出参数为单应性矩阵。 最后,可以使用计算出的单应性矩阵变换图像。在MATLAB中,可以使用“imwarp”函数来变换图像。该函数的输入参数包括需要变换的图像和计算出的单应性矩阵。输出参数为变换后的图像。 需要注意的是,在计算单应性矩阵时,对应点应该足够多且分布均匀,否则计算出的单应性矩阵可能有误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值