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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

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

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

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

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

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

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

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

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

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

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

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

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

5.nameWindow()函數

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

(1)參數說明:1)窗口名2)窗口標識(WINDOW_NORMAL:可改變窗口大小;WINDOW_AUTOSIZE:窗口自動調整大小;WINDOW_OPENGL:窗口創建時支持OpenGL)
(2)作用:創建窗口

6. imwrite函數

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

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

#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()
{//創建帶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數據保存完畢~\n可以在工程目錄下查看由imwrite函數生成的圖片\n");waitKey(0);}catch (runtime_error& ex){fprintf(stderr, "圖像轉換成PNG格式發生錯誤:%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]動漫圖");    //創建一個名為“【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 滑動條的創建和使用

3.2.1 創建滑動條:createTrackbar()函數

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

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

#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_dAlphValue;
double g_dBetaValue;
//聲明存儲圖像的變量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
//響應滑動條的回調函數,第一個參數是軌跡條位置,第二個參數是用戶數據
void on_Teackbar(int, void*)
{//求出當前alpha值相對于最大值的比例g_dAlphValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;//則beta值為1減去alpha值g_dBetaValue = (1.0 - g_dAlphValue);//根據alpha和beta值進行線性混合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函數指定的圖片存在~!\n");return -1;}if (!g_srcImage2.data){printf("讀取第二幅圖片錯誤,請確定目錄下是否有imread函數指定的圖片存在~!\n");return -1;}//設置滑動條初值為70g_nAlphaValueSlider = 70;//創建窗體namedWindow(WINDOW_NAME, 1);//在創建的窗體中創建一個滑動條控件char TrackbarName[50];sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue);createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue,on_Teackbar);//結果在回調函數中顯示on_Teackbar(g_nAlphaValueSlider, 0);//按任意鍵退出waitKey(0);return 0;
}

3.2.2 getTrackbarPos()函數

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

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

3.3 鼠標操作

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

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

#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);int main()
{//[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);cvSetMouseCallback(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;
}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;}
}
//自定義的矩形繪制函數
void DrawRectangle(cv::Mat& img, cv::Rect box)
{//隨機顏色rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。