[转]利用OpenCV实现图像的叠加
2017-10-16 10:08
323 查看
Fr:利用OpenCV实现图像的叠加
因为工作需要,我经常需要把两个图像叠加在一起。QT的QImage,或者MFC的CImage,都无法提供这种功能。(QT提供图像叠加功能,但不好使,见我的博客Qt的四个常见的图像叠加模式)实现叠加图像功能的最理想工具是OpenCV。下面给出我的图像叠加示例代码,并加以解释。
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;
}
因为工作需要,我经常需要把两个图像叠加在一起。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实现图像的叠加
- opencv开发笔记(八):利用感兴趣区域ROI实现图像叠加
- 利用OpenCV实现图像边缘直方图输出
- Android Jni 利用OpenCV 实现图像尺寸缩放(三)
- 利用OpenCV的inpaint函数实现图像的污点修复
- 利用均值漂移实现图像分割的原理和OpenCV代码
- OpenCV利用矩阵实现图像旋转
- Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配
- 利用OpenCV实现图像纹理特征提取
- opencv开发笔记(九):利用addWeighted实现感兴趣区域图像混合
- OpenCV下利用傅里叶变换和逆变换实现图像卷积算法,并附自己对于卷积核/模板核算子的理解!
- 利用opencv实现图像滑动窗口操作
- opencv系列之一 利用透视变换实现图像的俯视图(正视图)
- 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)
- 利用OpenCV实现图像拼接的代码!
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
- 利用python opencv实现图像自适应二值化
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
- Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配
- 利用python opencv实现图像自适应二值化