相机标定 - (05) - 案例:单应矩阵用于图像视角变换

目录

5 单应矩阵用于图像视角变换

5.1 应用原理

5.2 案例-替换广告牌图像

5.3 完整代码 


5 单应矩阵用于图像视角变换

5.1 应用原理

        在射影几何中,单应矩阵更多的被用来表征两个图像平面之间的变换关系。世界坐标系到图像坐标系的变换如下:

s\begin{bmatrix} u\\ v\\ z\\ 1 \end{bmatrix}=A\begin{bmatrix} R &T \end{bmatrix}\begin{bmatrix} X_{w}\\ Y_{w}\\ Z_{w}\\ 1 \end{bmatrix}

在平面上Z=0,并简化上述形式:

s\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}=M\begin{bmatrix} X_{w}\\ Y_{w}\\ 1 \end{bmatrix}

在两个相机拍摄同一平面时,有如下的等式:

s\begin{bmatrix} u_{2}\\ v_{2}\\ 1 \end{bmatrix}=M_{2}\begin{bmatrix} X_{w}\\ Y_{w}\\ 1 \end{bmatrix}=M_{2}M_{1}^{-1}\begin{bmatrix} u_{1}\\ v_{1}\\ 1 \end{bmatrix}

也就是,存在一组关系,可以实现两个像素平面的互相变换。

 

5.2 案例-替换广告牌图像

本案例要实现的效果,将汽车图片贴在广告牌上。

 (1)读取汽车图像,用vector存储汽车图像的四个角。

// 读取汽车图片
// 定义vector存储图像的四个角
Mat im_src = imread("../AUdi_A8.jpg");
    
Size size = im_src.size();
vector<Point2f> pts_src;
pts_src.push_back(Point2f(0,0));
pts_src.push_back(Point2f(size.width - 1, 0));
pts_src.push_back(Point2f(size.width - 1, size.height -1));
pts_src.push_back(Point2f(0, size.height - 1 ));

(2)读取广告牌图像,定义结果图像。

// 读取广告牌图像
Mat im_dst = imread("../billboard.jpg");
Mat im_temp = im_dst.clone();
// 定义结果图像
userdata data;
data.im = im_temp;
imshow("Image", im_temp);

(3)定义鼠标事件,用于点击广告牌要贴如汽车图片的区域。

// 定义鼠标事件,用于点击广告牌要贴如汽车图片的区域
cout << "从左上角依次顺时针点击要贴入广告牌的区域" << endl;
setMouseCallback("Image", mouseHandler, &data);
waitKey(0);

(4)计算单应矩阵,并将car图片进行透视变换。

// 计算单应矩阵,并将car图片进行透视变换
Mat H = findHomography(pts_src, data.points, 0); //计算单应矩阵
warpPerspective(im_src, data.im, H, data.im.size()); //透视变换
imshow("perspect",data.im);
    

(5)进行图像填充并显示。

// 进行图像填充
Point pts_dst[4];
for (int i = 0; i < 4; i++)
{
     pts_dst[i] = data.points[i];
}
fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), CV_AA);
im_dst = im_dst + data.im;

// 显示结果
imshow("Image", im_dst);
waitKey(0);

5.3 完整代码 

(1)CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(opencv_homograph_project)

set(OpenCV_DIR "E:/SDK/opencv/build")
find_package(OpenCV REQUIRED)

add_executable(opencv_homograph_demo virtual-billboard.cpp)
target_link_libraries(opencv_homograph_demo PRIVATE ${OpenCV_LIBS})

(2) opencv_homograph_project.cpp

#include <opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc_c.h>

using namespace cv;
using namespace std;

struct userdata{
    Mat im;
    vector<Point2f> points;
};

void mouseHandler(int event, int x, int y, int flags, void* data_ptr)
{
    if  ( event == EVENT_LBUTTONDOWN )
    {
        userdata *data = ((userdata *) data_ptr);
        circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, CV_AA);
        imshow("Image", data->im);
        if (data->points.size() < 4)
        {
            data->points.push_back(Point2f(x,y));
        }
    }
    
} 

int main( int argc, char** argv)
{

    // 读取汽车图片
    // 定义vector存储图像的四个角
    Mat im_src = imread("../AUdi_A8.jpg");
    
    Size size = im_src.size();
    vector<Point2f> pts_src;
    pts_src.push_back(Point2f(0,0));
    pts_src.push_back(Point2f(size.width - 1, 0));
    pts_src.push_back(Point2f(size.width - 1, size.height -1));
    pts_src.push_back(Point2f(0, size.height - 1 ));
    
    // 读取广告牌图像
    Mat im_dst = imread("../billboard.jpg");
    Mat im_temp = im_dst.clone();
    // 定义结果图像
    userdata data;
    data.im = im_temp;
    imshow("Image", im_temp);
    
    // 定义鼠标事件,用于点击广告牌要贴如汽车图片的区域
    cout << "从左上角依次顺时针点击要贴入广告牌的区域" << endl;
    setMouseCallback("Image", mouseHandler, &data);
    waitKey(0);
    
    // 计算单应矩阵,并将car图片进行透视变换
    Mat H = findHomography(pts_src, data.points, 0); //计算单应矩阵
    warpPerspective(im_src, data.im, H, data.im.size()); //透视变换
    imshow("perspect",data.im);
    
    // 进行图像填充
    Point pts_dst[4];
    for (int i = 0; i < 4; i++)
    {
        pts_dst[i] = data.points[i];
    }
    fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), CV_AA);
    im_dst = im_dst + data.im;

    // 显示结果
    imshow("Image", im_dst);
    waitKey(0);

    return 0;
}

​​​​​​​

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
红外相机标定是指对红外相机进行精确校准和调整,以保证其在红外光谱范围内的成像质量和测量精准度。它是红外成像技术中非常重要的一部分,可以提高相机的可靠性和准确性。 红外相机标定的具体步骤包括以下几个方面: 第一,调整温度参考。红外相机使用温度差异来生成图像,所以需要准确的温度参考。在标定之前,需要确保温度参考源的稳定性和准确性,通常使用稳定的黑体源或空气温度计来进行校准。 第二,调整焦距和对焦。在红外成像中,焦距与像距之间的关系需要进行校准,以确保成像清晰。通过调整相机的焦距和对焦方式,可以获得最佳的红外图像质量。 第三,校准灵敏度和响应。红外相机的灵敏度和响应能力会受到环境因素的影响,因此需要进行标定。通过参考标准物体的红外辐射和灰度值,可以调整相机的灵敏度和响应范围,以获得更准确的测量结果。 第四,校准色彩和对比度。红外相机在显示图像时,可能会出现色彩偏差和对比度不足的问题。通过调整相机的色彩校正和对比度,可以提高图像的可视化效果,使得目标物体在红外图像中更容易被识别和分析。 红外相机标定是确保红外成像设备正常工作的重要步骤,它可以提高红外图像的质量和测量的精确度。通过准确的标定,红外相机可以更好地应用于工业、医学等领域,为我们带来更多的便利和突破。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几度春风里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值