利用OpenCV实现图像的叠加

来源:互联网 发布:上海东京飞机票知乎 编辑:程序博客网 时间:2024/06/05 15:30

这次摸索受到了http://wenku.baidu.com/link?url=5EFJU1fmuU3zD3wYcdiElcKcAfx7vDWNYiwROhyXvZln9sSR8UiKs1PBks9KreGXi9MeriFlgRn0RzB688jVYvGT7vmciYdg5yIuv3-sHvG

的启发。


因为工作需要,我经常需要把两个图像叠加在一起。QT的QImage,或者MFC的CImage,都无法提供这种功能。(QT提供图像叠加功能,但不好使,见我的博客Qt的四个常见的图像叠加模式)实现叠加图像功能的最理想工具是OpenCV。下面给出我的图像叠加示例代码,并加以解释。


#include "overlapmat.h"#include <opencv2/opencv.hpp>  #include <QImage>#include <QPainter>  using namespace cv; #pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_core249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_imgproc249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_highgui249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_ml249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_video249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_features2d249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_calib3d249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_objdetect249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_contrib249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_legacy249d.lib")#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_flann249d.lib")Matm_matMTI;Matm_matMask;Matm_matSAR;QImagem_img;OverlapMat::OverlapMat(QWidget *parent): QMainWindow(parent){ui.setupUi(this);m_matMTI = imread("E:\\VC\\MTI.png",CV_LOAD_IMAGE_COLOR);//CV_LOAD_IMAGE_GRAYSCALE);m_matSAR = imread("E:\\VC\\SAR.jpg",CV_LOAD_IMAGE_COLOR);//m_matMask = imread("E:\\VC\\MTI.png",CV_LOAD_IMAGE_GRAYSCALE);cvtColor(m_matMTI, m_matMask, CV_BGR2GRAY);Mat ROI = m_matSAR(cv::Rect(20,50, m_matMTI.cols, m_matMTI.rows));m_matMTI.copyTo(ROI, m_matMask);//假如用m_matMTI.copyTo(ROI),MTI的黑背景也会画到m_matSAR上面.imwrite("E:\\merge.bmp", m_matSAR);}OverlapMat::~OverlapMat(){}void OverlapMat::paintEvent(QPaintEvent *e){}

MTI.png:


SAR.jpg:



混合后的效果:


可见,在混合的图片的左上角,出现了红色圆圈和绿色方块。而且黑色背景没有一起叠加上去。

实现这个效果的关键语句是 m_matMTI.copyTo(ROI, m_matMask);

m_matMTI是你想要添加的图像,ROi是被叠加的(即接受m_matMTI的图像)。ROI可以是一整幅图的一部分,在本实例里面,ROI是m_matSAR的一部分。其左上角坐标在

SAR.jpg里面的位置是(20,50),其面积与MTI.png一样大。ROI只是m_matMTI的一份浅拷贝,因此,copyTo函数归根结底,还是拷贝到了m_matMTI上面。ROI只是给出图像添加到m_matMTI的哪个位置。

m_matMask是一个灰度图,它检测m_matMTI的所有像素,假如像素的取值是(0,0,0)即黑色,那么这个像素就不做叠加处理。正是m_matMask的存在,才阻止了黑色背景叠加进来。读者可以试下,用m_matMTI.copyTo(ROI)代替m_matMTI.copyTo(ROI, m_matMask);。这样会把黑色背景也叠加进来。

0 0
原创粉丝点击