1. 程式人生 > >【opencv入門之二】感興趣區域ROI,線性混合addWeighted

【opencv入門之二】感興趣區域ROI,線性混合addWeighted

bsp enc 擁有 ted 興趣 通道數 amp log 兩個

參考網站:

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