您的位置:首页 > 运维架构

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

2017-10-16 10:08 323 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv