日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《OpenCV3编程入门》学习笔记3 HighGUI图形用户界面初步

發(fā)布時間:2023/11/27 生活经验 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《OpenCV3编程入门》学习笔记3 HighGUI图形用户界面初步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第3章 HighGUI圖形用戶界面初步

3.1 圖像的載入、顯示和輸出到文件

1.OpenCV命名空間2種訪問方法
(1)代碼開頭加:usingnamespace cv;
(2)每個類或函數(shù)前加:cv::

2.Mat類
(1)Mat類用于保存圖像及其他矩陣數(shù)據(jù),默認(rèn)尺寸0
(2)定義Mat對象: cv::Mat pic(320,640,cv::Scalar(100));

3.圖像載入:imread()函數(shù)

函數(shù)原型:Mat imread(const string& filename, intflags=1);

(1)const string& filename : 載入圖片路徑名,Windows系統(tǒng)下,OpenCV的imread函數(shù)支持類型:

(2)int flags:載入標(biāo)識,制定加載圖像的顏色類型:
· 取值0,CV_LOAD_IMAGE_GRAYSCALE,始終將圖像轉(zhuǎn)換成灰度再返回
· 取值1,CV_LOAD_IMAGE_COLOR,總是轉(zhuǎn)換圖像到彩色再返回
· 取值2,CV_LOAD_IMAGE_ANYDEPTH,載入圖像深度為16位或32位,就返回對應(yīng)深度圖像,否則轉(zhuǎn)換為8位圖像再返回
通常:
·flags>0返回一個3通道彩色圖像
·flags=0返回灰度圖像
·flags<0返回包含Alpha通道的加載圖像

4.圖像顯示:imshow()函數(shù)

函數(shù)原型:void imshow(const string& winname,InputArray mat);

(1)const string&類型的winname,填需要顯示的窗口標(biāo)識名稱
(2)InputArray類型的mat,填需要顯示的圖像
(3)imshow默認(rèn)窗口(CV_WINDOW_AUTOSIZE)顯示圖像原始大小,否則縮放以適合窗口,縮放取決于圖像深度:
·8位無符號類型圖像,顯示原始大小
·16位無符號或32位整型,像素值除以256,即[0,255*256]->[0,255]
·32位浮點數(shù),像素值乘以255,即[0,1]->[0,255]

5.nameWindow()函數(shù)

函數(shù)原型:void nameWindow(const string& winname,int flas=EINDOW_AUTOSIZE);

(1)參數(shù)說明:1)窗口名2)窗口標(biāo)識(WINDOW_NORMAL:可改變窗口大小;WINDOW_AUTOSIZE:窗口自動調(diào)整大小;WINDOW_OPENGL:窗口創(chuàng)建時支持OpenGL)
(2)作用:創(chuàng)建窗口

6. imwrite函數(shù)

函數(shù)原型:bool imwrite(const string& fliename,InputArray img,const vector& params=vector());

(1)參數(shù)說明:
文件名;
Mat類型的圖像數(shù)據(jù);
特定格式保存的參數(shù)編碼(默認(rèn)vector()):JPEG格式圖片,參數(shù)表示0-100的圖片質(zhì)量(默認(rèn)值95);PNG格式圖片,參數(shù)表示0-9壓縮級別(默認(rèn)值3);PPM\PGM\PB,格式圖片,參數(shù)表示0或1二進(jìn)制格式標(biāo)志(默認(rèn)值1)
(2)作用:輸出到文件
(3)示例:在OpenCV中生成一副png圖片,并寫到當(dāng)前目錄下

#include<opencv2/opencv.hpp>
#include<vector>using namespace 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()
{//創(chuàng)建帶Alpha通道的MatMat 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數(shù)據(jù)保存完畢~\n可以在工程目錄下查看由imwrite函數(shù)生成的圖片\n");waitKey(0);}catch (runtime_error& ex){fprintf(stderr, "圖像轉(zhuǎn)換成PNG格式發(fā)生錯誤:%s\n", ex.what());return 1;}return 0;
}

7.圖像載入、混合、顯示、輸出到文件綜合示例

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>using namespace cv;int main()
{//1.圖像的載入和顯示Mat girl = imread("girl.jpg");namedWindow("[1]動漫圖");    //創(chuàng)建一個名為“【1】動漫圖”的窗口imshow("[1]動漫圖", girl);//2.初級圖像混合Mat image = imread("cat.jpg");Mat logo = imread("dog.jpg");namedWindow("[2]原畫圖");imshow("[2]原畫圖", image);namedWindow("[3]logo圖");imshow("[3]logo圖", logo);Mat imageROI;//定義一個Mat類型,用于存放,圖像的ROIimageROI = image(Rect(800, 300, logo.cols, logo.rows));//方法一//imageROI = image(Range(350, 350 + logo.rows), Range(800, 800 + logo.cols));//方法二addWeighted(imageROI, 0.5, logo, 0.3, 0.0, imageROI);//將logo加到原圖上namedWindow("[4]原畫+logo圖");imshow("[4]原畫+logo圖", image);//3.圖像輸出//imwrite("由imwrite生成的圖片", image);waitKey(0);return 0;
}

3.2 滑動條的創(chuàng)建和使用

3.2.1 創(chuàng)建滑動條:createTrackbar()函數(shù)

函數(shù)原型:int createTrackbar(conststring& trackbarname,conststring& winname,int* value,int count,TrackbarCallback onChange=0,void* userdata=0);

(1)參數(shù)說明:軌跡條名字 ,依附窗口名 , 滑塊初始位置 ,滑塊可以到達(dá)的最大位置, 指向回調(diào)函數(shù)指針(每當(dāng)滑塊改變時函數(shù)都會回調(diào)), 用戶傳給回調(diào)函數(shù)的數(shù)據(jù)
(2)函數(shù)作用:創(chuàng)建一個具有特定名稱和范圍的軌跡條
(3)示例:用軌跡條控制兩幅圖像的Alpha混合

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;#define WINDOW_NAME "[線性混合示例]"   //為窗口標(biāo)題定義的宏
//全局變量聲明
const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑動條對應(yīng)的變量
double g_dAlphValue;
double g_dBetaValue;
//聲明存儲圖像的變量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
//響應(yīng)滑動條的回調(diào)函數(shù),第一個參數(shù)是軌跡條位置,第二個參數(shù)是用戶數(shù)據(jù)
void on_Teackbar(int, void*)
{//求出當(dāng)前alpha值相對于最大值的比例g_dAlphValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;//則beta值為1減去alpha值g_dBetaValue = (1.0 - g_dAlphValue);//根據(jù)alpha和beta值進(jìn)行線性混合addWeighted(g_srcImage1, g_dAlphValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);//顯示效果圖imshow(WINDOW_NAME, g_dstImage);
}
int main()
{//加載圖像(兩圖像尺寸需要相同)g_srcImage1 = imread("1.jpg");g_srcImage2 = imread("2.jpg");if(!g_srcImage1.data){printf("讀取第一幅圖片錯誤,請確定目錄下是否有imread函數(shù)指定的圖片存在~!\n");return -1;}if (!g_srcImage2.data){printf("讀取第二幅圖片錯誤,請確定目錄下是否有imread函數(shù)指定的圖片存在~!\n");return -1;}//設(shè)置滑動條初值為70g_nAlphaValueSlider = 70;//創(chuàng)建窗體namedWindow(WINDOW_NAME, 1);//在創(chuàng)建的窗體中創(chuàng)建一個滑動條控件char TrackbarName[50];sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue);createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue,on_Teackbar);//結(jié)果在回調(diào)函數(shù)中顯示on_Teackbar(g_nAlphaValueSlider, 0);//按任意鍵退出waitKey(0);return 0;
}

3.2.2 getTrackbarPos()函數(shù)

函數(shù)原型:int getTrackbarPos(conststring& trackbarname,conststring& winname);

(1)參數(shù)說明: 軌跡條名字 , 窗口名
(2)作用:獲取當(dāng)前軌跡條位置

3.3 鼠標(biāo)操作

SetMouseCallback()函數(shù):void setMouseCallback(conststring& winname,MouseCallback onMouse,void* userdata=0)

(1)參數(shù)說明:窗口名字,指定窗口里每次鼠標(biāo)事件發(fā)生的時候被調(diào)用的函數(shù)指針,用戶定義的傳遞到回調(diào)函數(shù)的參數(shù)(默認(rèn)0)
(2)作用:為指定的窗口設(shè)置鼠標(biāo)消息回調(diào)函數(shù)
(3)示例:

#include<opencv2/opencv.hpp>
using namespace cv;#define WINDOW_NAME "[程序窗口]"  //為窗口標(biāo)題定義的宏//全局函數(shù)的聲明
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; //是否進(jìn)行繪制
RNG g_rng(12345);int main()
{//[1]準(zhǔn)備參數(shù)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]設(shè)置鼠標(biāo)操作回調(diào)函數(shù)namedWindow(WINDOW_NAME);cvSetMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);//[3]程序主循環(huán),當(dāng)進(jìn)行繪制的標(biāo)識符為真時,進(jìn)行繪制while (1){srcImage.copyTo(tempImage);//復(fù)制原圖到臨時變量if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);//當(dāng)進(jìn)行繪制的標(biāo)識符為真,則進(jìn)行繪制imshow(WINDOW_NAME, tempImage);if (waitKey(10) == 27) break;//按下ESC鍵,程序退出}return 0;
}void on_MouseHandle(int event, int x, int y, int flags, void* param)
{Mat& image = *(cv::Mat*)param;switch (event){//鼠標(biāo)移動消息case EVENT_MOUSEMOVE:{if (g_bDrawingBox)//如果是否進(jìn)行繪制的標(biāo)識符為真,則記錄下長和寬到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;//置標(biāo)識符為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;}//調(diào)用函數(shù)進(jìn)行繪制DrawRectangle(image, g_rectangle);}break;}
}
//自定義的矩形繪制函數(shù)
void DrawRectangle(cv::Mat& img, cv::Rect box)
{//隨機(jī)顏色rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

總結(jié)

以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记3 HighGUI图形用户界面初步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。