opencv 1 HighGUI圖形用戶界面初步


1圖像載入 顯示和輸出到文件

Opencv的命名空間

Mat類

圖像的載入:imread()函數





圖片的顯示:imshow()函數

創建窗口:namedWindow()函數


輸出圖像到文件:imwrite()函數

#include<opencv2/opencv.hpp>
#include<vector>
#include <opencv2/imgproc/imgproc.hpp>//OpenCV 圖像處理頭文件 
using namespace cv; // 包含 cv 命名空間
using namespace std;
void createAlphaMat(Mat &mat)
{
	for (int i = 0; i < mat.rows; ++i)
	{
		for(int j = 0;j < mat.cols; ++j)
		{
		Vec4b&rgba = mat.at<Vec4b>(i, j);
		rgba[0] = UCHAR_MAX;
		rgba[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols)*UCHAR_MAX);
		rgba[2] = saturate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows)*UCHAR_MAX);
		rgba[3] = saturate_cast<uchar>(0.5*(rgba[1] + rgba[2]));
		}

	}
}
int main() //控制台應用程序的入 口 函數,我們的程序從這里開始
{
	Mat mat(480,640,CV_8UC4);
	createAlphaMat(mat);
	vector<int>compression_params;
	compression_params.push_back(IMWRITE_PNG_COMPRESSION);
	compression_params.push_back(9);
	try {
		imwrite("透明Alpha值圖.png", mat, compression_params);
		imshow("生成的PNG圖", mat);
			fprintf(stdout, "PNG圖片文件的alpha數據保存完畢`\n可以在工程目錄下查看\n");
		waitKey(0);
		}
	catch (runtime_error&ex)
	{
		fprintf(stderr, "圖像轉換成PNG格式發生錯誤:%s\n", ex.what());
		return 1;
	}
return 0;
}

綜合實例

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;


int main()
{
	//-----------------------------------【一、圖像的載入和顯示】---------------------------------
	//	描述:以下三行代碼用於完成圖像的載入和顯示
	//--------------------------------------------------------------------------------------------------

	Mat girl = imread("G:\\視覺資料\\【OpenCV3版】《OpenCV3編程入門》書本配套源代碼\\【1】書本正篇程序源代碼\\【3】第三章\\【16】圖像的載入,顯示和輸出\\16_圖像的載入,顯示和輸出\\girl.jpg"); //載入圖像到Mat
	namedWindow("【1】動漫圖"); //創建一個名為 "【1】動漫圖"的窗口  
	imshow("【1】動漫圖", girl);//顯示名為 "【1】動漫圖"的窗口  

	//-----------------------------------【二、初級圖像混合】--------------------------------------
	//	描述:二、初級圖像混合
	//--------------------------------------------------------------------------------------------------
	//載入圖片
	Mat image = imread("G:\\視覺資料\\【OpenCV3版】《OpenCV3編程入門》書本配套源代碼\\【1】書本正篇程序源代碼\\【3】第三章\\【16】圖像的載入,顯示和輸出\\16_圖像的載入,顯示和輸出\\dota.jpg");
	Mat logo = imread("G:\\視覺資料\\【OpenCV3版】《OpenCV3編程入門》書本配套源代碼\\【1】書本正篇程序源代碼\\【3】第三章\\【16】圖像的載入,顯示和輸出\\16_圖像的載入,顯示和輸出\\dota_logo.jpg");

	//載入后先顯示
	namedWindow("【2】原畫圖");
	imshow("【2】原畫圖", image);

	namedWindow("【3】logo圖");
	imshow("【3】logo圖", logo);

	// 定義一個Mat類型,用於存放,圖像的ROI
	Mat imageROI;
	//方法一
	imageROI = image(Rect(800, 350, logo.cols, logo.rows));
	//方法二
	//imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));

	// 將logo加到原圖上
	addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);

	//顯示結果
	namedWindow("【4】原畫+logo圖");
	imshow("【4】原畫+logo圖", image);

	//-----------------------------------【三、圖像的輸出】--------------------------------------
	//	描述:將一個Mat圖像輸出到圖像文件
	//-----------------------------------------------------------------------------------------------
	//輸出一張jpg圖片到工程目錄下
	imwrite("由imwrite生成的圖片.jpg", image);

	waitKey();

	return 0;
}

滑動條的創建和使用

創建 (creatTrackbar()函數)



17_為程序界面添加滑動條

//---------------------------------【頭文件、命名空間包含部分】-------------------------------
//		描述:包含程序所使用的頭文件和命名空間
//-------------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

//-----------------------------------【宏定義部分】-------------------------------------------- 
//  描述:定義一些輔助宏 
//------------------------------------------------------------------------------------------------ 
#define WINDOW_NAME "【滑動條的創建&線性混合示例】"        //為窗口標題定義的宏 


//-----------------------------------【全局變量聲明部分】--------------------------------------
//		描述:全局變量聲明
//-----------------------------------------------------------------------------------------------
const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑動條對應的變量
double g_dAlphaValue;
double g_dBetaValue;

//聲明存儲圖像的變量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;


//-----------------------------------【on_Trackbar( )函數】--------------------------------
//		描述:響應滑動條的回調函數
//------------------------------------------------------------------------------------------
void on_Trackbar(int, void*)
{
	//求出當前alpha值相對於最大值的比例
	g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
	//則beta值為1減去alpha值
	g_dBetaValue = (1.0 - g_dAlphaValue);

	//根據alpha和beta值進行線性混合
	addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);

	//顯示效果圖
	imshow(WINDOW_NAME, g_dstImage);
}


//-----------------------------【ShowHelpText( )函數】--------------------------------------
//		描述:輸出幫助信息
//-------------------------------------------------------------------------------------------------
//-----------------------------------【ShowHelpText( )函數】----------------------------------
//		描述:輸出一些幫助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
	
	printf("\n\n\t\t\t   當前使用的OpenCV版本為:" CV_VERSION);
	printf("\n\n  ----------------------------------------------------------------------------\n");
}


//--------------------------------------【main( )函數】-----------------------------------------
//		描述:控制台應用程序的入口函數,我們的程序從這里開始執行
//-----------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{

	//顯示幫助信息
	ShowHelpText();

	//加載圖像 (兩圖像的尺寸需相同)
	g_srcImage1 = imread("G:\\視覺資料\\【OpenCV3版】《OpenCV3編程入門》書本配套源代碼\\【1】書本正篇程序源代碼\\【3】第三章\\【17】為程序界面添加滑動條\\17_為程序界面添加滑動條\\1.jpg");
	g_srcImage2 = imread("G:\\視覺資料\\【OpenCV3版】《OpenCV3編程入門》書本配套源代碼\\【1】書本正篇程序源代碼\\【3】第三章\\【17】為程序界面添加滑動條\\17_為程序界面添加滑動條\\2.jpg");
	if (!g_srcImage1.data) { printf("讀取第一幅圖片錯誤,請確定目錄下是否有imread函數指定圖片存在~! \n"); return -1; }
	if (!g_srcImage2.data) { printf("讀取第二幅圖片錯誤,請確定目錄下是否有imread函數指定圖片存在~!\n"); return -1; }

	//設置滑動條初值為70
	g_nAlphaValueSlider = 70;

	//創建窗體
	namedWindow(WINDOW_NAME, 1);

	//在創建的窗體中創建一個滑動條控件
	char TrackbarName[50];
	sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue);

	createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);

	//結果在回調函數中顯示
	on_Trackbar(g_nAlphaValueSlider, 0);

	//按任意鍵退出
	waitKey(0);

	return 0;
}

鼠標操作


實例
//--------------------------------------【程序說明】-------------------------------------------
//		程序說明:《OpenCV3編程入門》OpenCV2版書本配套示例程序18
//		程序描述:HelloOpenCV
//		開發測試所用IDE版本:Visual Studio 2010
//		開發測試所用OpenCV版本:	3.0 beta
//		2014年11月 Created by @淺墨_毛星雲
//		2014年12月 Revised by @淺墨_毛星雲
//------------------------------------------------------------------------------------------------

//---------------------------------【頭文件、命名空間包含部分】-----------------------------
//		描述:包含程序所使用的頭文件和命名空間
//-------------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
using namespace cv;

//-----------------------------------【宏定義部分】--------------------------------------------
//  描述:定義一些輔助宏 
//------------------------------------------------------------------------------------------------ 
#define WINDOW_NAME "【程序窗口】"        //為窗口標題定義的宏 


//-----------------------------------【全局函數聲明部分】------------------------------------
//		描述:全局函數的聲明
//------------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);
void ShowHelpText();

//-----------------------------------【全局變量聲明部分】-----------------------------------
//		描述:全局變量的聲明
//-----------------------------------------------------------------------------------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//是否進行繪制
RNG g_rng(12345);



//-----------------------------------【main( )函數】--------------------------------------------
//		描述:控制台應用程序的入口函數,我們的程序從這里開始執行
//-------------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
	//【0】改變console字體顏色
	system("color 9F");

	//【0】顯示歡迎和幫助文字
	ShowHelpText();

	//【1】准備參數
	g_rectangle = Rect(-1, -1, 0, 0);
	Mat srcImage(600, 800, CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);
	g_rectangle = Rect(-1, -1, 0, 0);
	srcImage = Scalar::all(0);

	//【2】設置鼠標操作回調函數
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);

	//【3】程序主循環,當進行繪制的標識符為真時,進行繪制
	while (1)
	{
		srcImage.copyTo(tempImage);//拷貝源圖到臨時變量
		if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);//當進行繪制的標識符為真,則進行繪制
		imshow(WINDOW_NAME, tempImage);
		if (waitKey(10) == 27) break;//按下ESC鍵,程序退出
	}
	return 0;
}



//--------------------------------【on_MouseHandle( )函數】-----------------------------
//		描述:鼠標回調函數,根據不同的鼠標事件進行不同的操作
//-----------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{

	Mat& image = *(cv::Mat*) param;
	switch (event)
	{
		//鼠標移動消息
	case EVENT_MOUSEMOVE:
	{
		if (g_bDrawingBox)//如果是否進行繪制的標識符為真,則記錄下長和寬到RECT型變量中
		{
			g_rectangle.width = x - g_rectangle.x;
			g_rectangle.height = y - g_rectangle.y;
		}
	}
	break;

	//左鍵按下消息
	case EVENT_LBUTTONDOWN:
	{
		g_bDrawingBox = true;
		g_rectangle = Rect(x, y, 0, 0);//記錄起始點
	}
	break;

	//左鍵抬起消息
	case EVENT_LBUTTONUP:
	{
		g_bDrawingBox = false;//置標識符為false
		//對寬和高小於0的處理
		if (g_rectangle.width < 0)
		{
			g_rectangle.x += g_rectangle.width;
			g_rectangle.width *= -1;
		}

		if (g_rectangle.height < 0)
		{
			g_rectangle.y += g_rectangle.height;
			g_rectangle.height *= -1;
		}
		//調用函數進行繪制
		DrawRectangle(image, g_rectangle);
	}
	break;

	}
}



//-----------------------------------【DrawRectangle( )函數】------------------------------
//		描述:自定義的矩形繪制函數
//-----------------------------------------------------------------------------------------------
void DrawRectangle(cv::Mat& img, cv::Rect box)
{
	cv::rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//隨機顏色
}


//-----------------------------------【ShowHelpText( )函數】-----------------------------
//          描述:輸出一些幫助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
	//輸出歡迎信息和OpenCV版本
	printf("\n\n\t\t\t非常感謝購買《OpenCV3編程入門》一書!\n");
	printf("\n\n\t\t\t此為本書OpenCV3版的第18個配套示例程序\n");
	printf("\n\n\t\t\t   當前使用的OpenCV版本為:" CV_VERSION);
	printf("\n\n  ----------------------------------------------------------------------------\n");
	//輸出一些幫助信息
	printf("\n\n\n\t歡迎來到【鼠標交互演示】示例程序\n");
	printf("\n\n\t請在窗口中點擊鼠標左鍵並拖動以繪制矩形\n");

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM