【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;
}
时间: 2024-10-25 15:38:22

【opencv入门之二】感兴趣区域ROI,线性混合addWeighted的相关文章

OpenCV设置感兴趣区域ROI,对图像进行局部处理

今天终于将霍夫检测的源码用C++写出来了,八天时间遇到最多的问题还是数据结构不熟悉,有些问题不知道怎么问,不知道从何下手 写出来的检测直线基本符合要求,问题是如果在现实中检测铁轨的话,附近会有石子,测试中发现如果石子的数目少,则检测效果较好,如果石子多,那么石子构成的点将影响检测 现在想到的一种方法就是设置感兴趣区域,将石子的影响减少 源码如下: 1.Iplimage设置感兴趣区域 int main( int argc, char** argv ) { IplImage *img = cvLoa

opencv图像及视频感兴趣区域设置

之前学过的简单绘图方法,例如矩形,椭圆等,今天试着在视频图像中用矩形标注感兴趣区域(ROI) <----图像篇----> #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace std;

opencv-视频处理--画感兴趣区域(ROI)

感兴趣区域的划分,在视频处理中有着重要应用,用OpenCV介绍两种,在视频中标注感兴趣区域的方法: 原视频: ----------------------------------------------------------------------------------------------------------------------------------- 第一种:暂停视频或者在视频流的第一帧中,画出感兴趣区域 #include<opencv2\core\core.hpp> #i

感兴趣区域ROI

Mat srcImage1 = imread("dota_pa.jpg"); Mat logoImage = imread("dota_logo.jpg"); Mat imageROI = srcImage1(Rect(10, 10, logoImage.cols, logoImage.rows));//使用矩形界定 logoImage.copyTo(imageROI);//就改变了srcImage1数据矩阵中的内容

【练习3.5】使用感兴趣区域(ROI)

2014-05-29 第三章 初探OpenCV 练习第5题: 题目:学习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图中使用ROI和cvSet建立一个增长如金字塔状的数组,也就是:外部边界为0,下一个内部边界应该为20,在下一个内部边界为40,依此类推,直到最后内部值为200,所有边界应该为10个像素宽度.最后显示这个图形. 按照题目要求使用ROI和cvSet实现 #include "stdafx.h" #include "cv.h"

OpenCV中感兴趣区域的选取与检测(一)

1.感兴趣区域的选取 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 很简单,根据ROI的坐标直接从原图抠出,不过前提是要知道其坐标,直接上例子吧. int getROI(Mat image, Rect rect) { Mat img=image.clone(); Mat roi; int cols=img.cols, rows=img.rows; //ROI越界,返回 if(col

opencv中感兴趣区域以及mask的使用

在图像处理的过程中,我们时常需要对指定区域或目标进行操作,这个区域我们称之为感兴趣区域.在学习opencv的初级阶段,对于感兴趣区域的操作方法是必须要掌握的. 比如下图: 我们获取到一帧图像Img,它里面有两个目标,一个蓝色块和一个红色块,我们一般会经常碰到以下三种情况: (1)我们希望将Img中的蓝色目标提取出来并另存为一个图像: (2)我们希望将Img中不是蓝色目标的其他目标都隐藏起来,只显示蓝色目标,或只对蓝色目标的区域进行图像处理. (3)我们只希望对Img中红色目标区域进行处理. 我们

获取图片中感兴趣区域的信息(Matlab实现)

内容提要 如果一幅图中只有一小部分图像你感兴趣(你想研究的部分),那么截图工具就可以了,但是如果你想知道这个区域在原图像中的坐标位置呢? 这可是截图工具所办不到的,前段时间我就需要这个功能,于是将其用Matlab实现. 其实只要用到Matlab中的两个函数: 函数: imrect 函数: getPosition 如果要截取其中的部分图像,就离不开下面的函数: 函数: imcrop 代码实现 clc; clear; close all; %-----------------------------

[zt] ROI (Region of Interest) 感兴趣区域 OpenCV

在以前介绍IplImage结构的时候,有一个重要的参数——ROI.ROI全称是”Region Of Interest”,即感兴趣的区域.实际上,它是IPL/IPP(这两个是Inter的库)结构IplROI的实例.IplROI包含xOffset.yOffset.height.width和coi成员变量.其中COI代表channel of interest(感兴趣的通道).ROI的思想是:一旦设定ROI,通常组用于整幅图像的函数便只会对ROI所表示的子图像进行操作.如果COI被设置非0值,则对该图像