[转]利用OpenCV实现图像的叠加

来源:互联网 发布:sublime 格式化js css 编辑:程序博客网 时间:2024/05/20 06:30

Fr:利用OpenCV实现图像的叠加


因为工作需要,我经常需要把两个图像叠加在一起。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")Mat m_matMTI;Mat m_matMask;Mat m_matSAR;QImage m_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)); //Rect((X,Y), WIDTH, HEIGHT) 大小必须匹配!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){}

cv::Rect() 区域的width,height must equal to the MTI


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

实现这个效果的关键语句是 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);。这样会把黑色背景也叠加进来。



Time waits for no one   OpenCV2 图像叠加




#include <opencv2/highgui/highgui.hpp>  //***** **#include <opencv2/core/core.hpp>int main(){    cv::Mat image = cv::imread("E:/Image/Fruits.jpg");    cv::Mat logo = cv::imread("E:/logo.png");    cv::Mat imageROI;    imageROI = image(cv::Rect(10,10,logo.cols,logo.rows));    cv::addWeighted(imageROI, 1.0, logo, 0.3, 0, imageROI);    cv::namedWindow("result");    cv::imshow("result",image);    cv::waitKey();    return 0;}