opencv入门之二感兴趣区域ROI,线性混合addWeighted
Posted Haven_zhf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv入门之二感兴趣区域ROI,线性混合addWeighted相关的知识,希望对你有一定的参考价值。
参考网站:
http://blog.csdn.net/poem_qianmo/article/details/20911629
1、感兴趣区域ROI
//【2】定义一个Mat类型并给其设定ROI区域 Mat imageROI = srcImage1( Rect(200, 250, logoImage.cols, logoImage.rows )); //【3】加载掩摸(必须是灰度图) Mat mask = imread( "dota_logo.jpg", 0 ); //【4】将掩摸拷贝到ROI logoImage.copyTo( imageROI , mask );
2、addWeighted函数
其原型:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
第一个参数:InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat
第二个参数:alpha,表示第一个数组的权重
第三个参数:src,表示需要第二个数组,它需要和第一个数组拥有相同的尺寸和通道数
第四个参数:beta,表示第二个数组的权重
第五个参数:gamma,一个加到权重总和上的标量值。????不是很懂
第六个参数:dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第七个参数:dtype,输出阵列的课选深度,有默认值-1.??????不懂
//【2】进行图像混合加权操作 betaBValue = (1.0 - aphaValue); addWeighted( srcImage2, aphaValue, srcImage3, betaBValue, 0.0, dstImage);
3、综合:
#include <cv.h> #include <highgui.h> #include <iostream> //*************************【命名空间声明部分】********************************** //描述:包含程序所使用的命名空间 //******************************************************************************* using namespace cv; using namespace std; //cout的命名空间??? //*************************【全局函数声明部分】********************************** //描述:全局函数声明 //******************************************************************************* bool ROI_AddImage(); bool LinearBlending(); bool ROI_LinearBlending(); //*************************【main()函数】********************************** //描述:控制台应用程序的入口函数,我们的程序从这里开始 //******************************************************************************* int main() { system("color 5E"); if (ROI_AddImage() && LinearBlending() && ROI_LinearBlending()) cout<<endl<<"嗯,非常gut。得出了你需要的图像了。!!!"; waitKey(0); return 0; } //*************************【ROI_AddImage()函数】********************************** //函数名:ROI_AddImage() //描述 :利用感兴趣区域ROI实现图像叠加 //******************************************************************************* bool ROI_AddImage() { //【1】读入图像 Mat srcImage1 = imread("dota_pa.jpg"); Mat logoImage = imread("dota_logo.jpg"); if (!srcImage1.data) { printf("damm,读取文件srcImage1错误~!\n"); return false; } if (!logoImage.data) { printf("damm,读取文件logoImage错误~!\n"); return false; } //【2】定义一个Mat类型并给其设定ROI区域 Mat imageROI = srcImage1( Rect(200, 250, logoImage.cols, logoImage.rows )); //【3】加载掩摸(必须是灰度图) Mat mask = imread( "dota_logo.jpg", 0 ); //【4】将掩摸拷贝到ROI logoImage.copyTo( imageROI , mask ); //【5】显示结果 namedWindow( " <1>利用ROI实现图像叠加示例窗口 " ); imshow( " <1>利用ROI实现图像叠加示例窗口 ",srcImage1 ); return true; } //*************************【LinearBlending()函数】************************************ //函数名:LinearBlending() //描述 :利用cv::addWeighted()函数实现图像线性混合 //************************************************************************************ bool LinearBlending() { //【0】定义一些局部变量 double aphaValue = 0.5; double betaBValue; Mat srcImage2,srcImage3,dstImage; //【1】读取图像(两幅图片需要同样的类型和尺寸) srcImage2 = imread("mogu.jpg"); srcImage3 = imread("rain.jpg"); if (!srcImage2.data) { printf("damm,读取文件srcImage2错误~!\n"); return false; } if (!srcImage3.data) { printf("damm,读取文件srcImage3错误~!\n"); return false; } //【2】进行图像混合加权操作 betaBValue = (1.0 - aphaValue); addWeighted( srcImage2, aphaValue, srcImage3, betaBValue, 0.0, dstImage); //【3】创建并显示原图窗口 namedWindow( "<2>线性混合示例窗口【原图】" , 1); imshow( "<2>线性混合示例窗口【原图】", srcImage2 ); namedWindow( "<3>线性混合示例窗口【效果图】" , 1); imshow( "<3>线性混合示例窗口【效果图】", srcImage3 ); namedWindow( "<4>线性混合示例窗口【效果图】" , 1); imshow( "<4>线性混合示例窗口【效果图】", dstImage ); return true; } //*************************【ROI_LinearBlending()函数】********************************** //函数名:ROI_LinearBlending() //描述 :线性混合实现函数,指定区域线性图像线性混合 // 利用cv::addWeighted()函数结合定义感兴趣区域ROI,实现自定义区域的线性混合 //*************************************************************************************** bool ROI_LinearBlending() { //【1】读取图像 Mat srcImage4 = imread("dota_pa.jpg"); Mat logoImage = imread("dota_logo.jpg"); if (!srcImage4.data) { printf("damm,读取文件srcImage4错误~!\n"); return false; } if (!logoImage.data) { printf("damm,读取文件logoImage错误~!\n"); return false; } //【2】定义一个Mat类型并给其设定ROI区域 //第一种表达 Mat imageROI = srcImage4( Rect(200, 250, logoImage.cols, logoImage.rows) ); //第二种表达 //Mat imageROI = srcImage4( Range(250, 250+logoImage.rows), Range(200, 200+logoImage.cols) ); //【3】将logo加到原图上 addWeighted(imageROI, 0.5, logoImage, 0.3, 0.0, imageROI); //【4】显示结果 namedWindow("<5>区域线性图像混合示例窗口", 1); imshow("<5>区域线性图像混合示例窗口", srcImage4); return true; }
以上是关于opencv入门之二感兴趣区域ROI,线性混合addWeighted的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV-C++选择提取感兴趣区域(ROI区域)附用鼠标选取ROI区域的代码