opencv从零开始——2. ROI与线性融合

来源:互联网 发布:iphone7p淘宝店铺 编辑:程序博客网 时间:2024/06/17 09:30

1.感兴趣的区域:ROI

ROI : 感兴趣的区域(region  of  interest )
代码如下:
#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace cv;using namespace std;bool ROI_AddImage(){    Mat srcImage1 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg");    Mat logoImage = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo3.jpg");    if (!srcImage1.data) {        return false;    }    if (!logoImage.data) {        return false;    }    Mat imageROI = srcImage1(Rect(300, 300, logoImage.cols, logoImage.rows));    Mat mask = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo3.jpg", 0);    logoImage.copyTo(imageROI, mask);    namedWindow("<1>利用ROI实现图像叠加示例窗口");    imshow("<1>利用ROI实现图像叠加示例窗口", srcImage1);    Mat img = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg");    imshow("原图", img);    waitKey(0);    return true;}//"/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/v1.jpg"int main(int argc, char* argv[]){    ROI_AddImage();    return 0;}


效果如下,小猫吃鱼的图片,就是插入进去的:



2. 图像融合

【注意】需要两幅图像,尺寸一致,本次采用的尺寸: 550*405

代码如下:
#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace cv;using namespace std;bool ROI_AddImage(){    Mat srcImage1 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg");    Mat logoImage = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo3.jpg");    if (!srcImage1.data) {        return false;    }    if (!logoImage.data) {        return false;    }    Mat imageROI = srcImage1(Rect(300, 300, logoImage.cols, logoImage.rows));    Mat mask = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo3.jpg", 0);    logoImage.copyTo(imageROI, mask);    namedWindow("<1>利用ROI实现图像叠加示例窗口");    imshow("<1>利用ROI实现图像叠加示例窗口", srcImage1);    Mat img = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg");    imshow("原图", img);    waitKey(0);    return true;}bool LinearBlending(){    double alphaValue = 0.5;    double betaValue;    Mat srcImage2, srcImage3, dstImage;    //两幅图片,需要裁剪成相同的尺寸,本例采用尺寸: 550 * 405    srcImage2 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/kobe.jpg");    srcImage3 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/James.jpg");    if (!srcImage2.data || !srcImage3.data) {        return false;    }    betaValue = 1.0 - alphaValue;    addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);    namedWindow("<3>线性混合示例窗口[效果图]", 1);    imshow("<3>线性混合示例窗口[效果图]", dstImage);    waitKey(0);    return true;}//"/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/v1.jpg"int main(int argc, char* argv[]){    //ROI_AddImage();    LinearBlending();    return 0;}

原图如下:



效果图如下:



3. 对感兴趣的区域,融入一幅图像

代码如下:
#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace cv;using namespace std;bool ROI_AddImage(){    Mat srcImage1 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg");    Mat logoImage = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo3.jpg");    if (!srcImage1.data) {        return false;    }    if (!logoImage.data) {        return false;    }    Mat imageROI = srcImage1(Rect(300, 300, logoImage.cols, logoImage.rows));    Mat mask = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo3.jpg", 0);    logoImage.copyTo(imageROI, mask);    namedWindow("<1>利用ROI实现图像叠加示例窗口");    imshow("<1>利用ROI实现图像叠加示例窗口", srcImage1);    Mat img = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg");    imshow("原图", img);    waitKey(0);    return true;}bool LinearBlending(){    double alphaValue = 0.5;    double betaValue;    Mat srcImage2, srcImage3, dstImage;    //两幅图片,需要裁剪成相同的尺寸,本例采用尺寸: 550 * 405    srcImage2 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/kobe.jpg");    srcImage3 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/James.jpg");    if (!srcImage2.data || !srcImage3.data) {        return false;    }    betaValue = 1.0 - alphaValue;    addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);    namedWindow("<3>线性混合示例窗口[效果图]", 1);    imshow("<3>线性混合示例窗口[效果图]", dstImage);    waitKey(0);    return true;}void ROI_AddImage_LinearBlending(){    Mat srcImage1 = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg", 1);    Mat logoImage = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo.jpg");    if (!srcImage1.data) {        return;    }    if (!logoImage.data) {        return;    }    Mat imageROI = srcImage1(Rect(20, 230, logoImage.cols, logoImage.rows));    addWeighted(imageROI, 0.5, logoImage, 0.3, 0. , imageROI);    namedWindow("<4>利用ROI实现图像叠加示例窗口");    imshow("<4>利用ROI实现图像叠加示例窗口", srcImage1);    Mat img = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/7.jpg");    imshow("原图", img);    waitKey(0);}//"/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/v1.jpg"int main(int argc, char* argv[]){    //ROI_AddImage();    //LinearBlending();    ROI_AddImage_LinearBlending();    return 0;}

效果图:





4.参考文献

[1] 毛星云 冷雪飞. OpenCV3编程入门[M]. 电子工业出版社, 2015.
1 0