多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > 《OpenCV3編程入門》學習筆記三:HighGUI圖形用戶界面

《OpenCV3編程入門》學習筆記三:HighGUI圖形用戶界面

來源:程序員人生   發(fā)布時間:2016-12-06 10:52:15 閱讀次數(shù):2696次

1:內(nèi)容介紹
本節(jié)主要介紹OpenCV的HighGUI模塊,并分享幾個例子:
1. 用imwrite函數(shù)生成png透明圖
2. 綜合示例程序:圖象的載入、顯示與輸出
3. 為程序界面添加滑動條
4. 鼠標操作
2:學習筆記
1. 使用OpenCV首先要學會使用它的圖形界面,此章節(jié)介紹了OpenCV的1些HighGUI使用方法,其實不觸及甚么理論部份。關于HighGUI大家可參考官網(wǎng)HighGUI模塊 http://docs.opencv.org/3.1.0/d7/dfc/group__highgui.html ,這里也只是講了其中1部份。
2. 這里推薦1個非常好用的調(diào)試進程中圖片查看插件Image Watch:http://blog.csdn.net/nnnnnnnnnnnny/article/details/52260370 。
3. 下面代碼中用到了ROI(region of interest),注意它的構(gòu)造方式。ROI重新設定了局部坐標,且并沒有分配新的內(nèi)存。
4. 這里順便穿插1下OpenCV 中Mat類型的深拷貝、淺拷貝,參見:http://www.voidcn.com/blog/qq_23968185/article/p⑸792518.html , http://blog.csdn.net/xiaxiazls/article/details/50018207
5. 下文代碼中也用到了saturate_cast 模板函數(shù),為避免數(shù)據(jù)不公道的數(shù)據(jù)轉(zhuǎn)換,類似于C++中的static_cast等強迫類型轉(zhuǎn)換。可參見:http://blog.csdn.net/mvtechnology/article/details/8139272
6. 本節(jié)函數(shù)清單
這里寫圖片描述
3:相干源碼及解析
1. 用imwrite函數(shù)生成png透明圖
源碼:

#include<opencv2/opencv.hpp> #include<vector> #include<iostream> using namespace cv; using namespace std; int main() { Mat mat(480, 640, CV_8UC4); //創(chuàng)建帶alpha通道的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); //為何上面的函數(shù)會用到saturate_cast呢,由于不管是加是減,乘除,都會超越1個像素灰度值的范圍(0~255)所以,所以當運算完以后,結(jié)果為負,則轉(zhuǎn)為0,結(jié)果超越255,則為255 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])); // rgba[3] = 0; } } vector<int> compression_params = { IMWRITE_PNG_COMPRESSION, 9 }; try { imwrite("透明Alpha值圖.png", mat, compression_params); imshow("【生成的png圖】", mat); cout << "PNG圖象保存終了,可在工程目錄下看到" << endl; } catch (runtime_error& ex) { cout << "圖象生成產(chǎn)生毛病:" << ex.what() << endl; } waitKey(0); return 0; }

素材:

效果圖:
透明Alpha值圖.png
這里寫圖片描述
提示:

2. 綜合示例程序:圖象的載入、顯示與輸出
源碼:

#include<opencv2/opencv.hpp> using namespace cv; int main() { Mat girl = imread("poster_girl.jpg"); imshow("【動漫畫】", girl); Mat dota = imread("poster_dota.jpg"); Mat logo = imread("poster_dota_logo.jpg"); imshow("【原圖】", dota); imshow("【logo圖】", logo); Mat imageROI; imageROI = dota(Rect(800, 350, logo.cols, logo.rows)); addWeighted(imageROI, 0.5, logo, 0.3, 0, imageROI); imshow("【原圖+logo圖】", dota); imwrite("poster_dota_logo_overlay.jpg", dota); waitKey(0); return 0; }

素材:
poster_girl.jpg
這里寫圖片描述
poster_dota.jpg
這里寫圖片描述
poster_dota_logo.jpg
這里寫圖片描述
效果圖:
poster_dota_logo_overlay.jpg
這里寫圖片描述
提示:
此程序中用到了ROI,ROI是重新設定局部坐標
3. 為程序界面添加滑動條
源碼:

#include<opencv2/opencv.hpp> using namespace cv; #define WINDOW_NAME "【線性混合示例】" const int g_nMaxAlphaValue = 100; //Alpha最大值 int g_nAlphaValueSlider=70; //滑動條對應的變量,初始值70 double g_dAlphaValue; double g_dBetaValue; Mat g_srcImage1; Mat g_srcImage2; Mat g_dstImage; void on_Tracker(int, void*); int main() { g_srcImage1 = imread("poster_spring_1.jpg"); g_srcImage2 = imread("poster_spring_2.jpg"); namedWindow(WINDOW_NAME); //此處1定要先創(chuàng)建窗體,否則Trackbar沒法顯示 String TrackbarName("透明值"); createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Tracker); on_Tracker(g_nAlphaValueSlider, 0); waitKey(0); return 0; } void on_Tracker(int, void*) { g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue; g_dBetaValue = 1.0 - g_dAlphaValue; addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0, g_dstImage); imshow(WINDOW_NAME, g_dstImage); }

素材:
poster_spring_1.jpg
poster_spring_1.jpg
poster_spring_2.jpg
這里寫圖片描述
效果圖:
這里寫圖片描述
提示:

4. 鼠標操作
源碼:

#include<opencv2/opencv.hpp> using namespace cv; #define WINDOW_NAME "【程序窗口】" void on_MouseHandle(int event, int x, int y, int flags, void* param); Rect g_rectangle=Rect(-1, -1, 0, 0); bool g_bDrawingBox = false; //是不是進行繪制 RNG g_rng; //生成隨機函數(shù)的類 int main() { Mat srcImage(600, 800, CV_8UC3, Scalar::all(0)), tempImage; srcImage.copyTo(tempImage); namedWindow(WINDOW_NAME); setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage); while (1){ srcImage.copyTo(tempImage); if (g_bDrawingBox) rectangle(tempImage, g_rectangle.tl(), g_rectangle.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255))); imshow(WINDOW_NAME, tempImage); if (waitKey(10) == 27) //按下ESC鍵 break; } return 0; } void on_MouseHandle(int event, int x, int y, int flags, void* param) { Mat& image = *(Mat*)param; switch (event) { //鼠標移動消息 case EVENT_MOUSEMOVE: { if (g_bDrawingBox) { 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; } rectangle(image, g_rectangle.tl(), g_rectangle.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255))); } break; } }

素材:

效果圖:
這里寫圖片描述
提示:

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 在线不卡亚洲 | 亚洲精品国产一区二区三区四区 | 波多野结衣视频在线看 | 日本护士xxxxxwww | 中文精品视频一区二区在线观看 | 亚洲精品嫩草研究院久久 | 一级片.| 日韩手机在线视频 | 久久久网久久久久合久久久久 | 日本成人黄色网址 | 精品欧美一区二区在线看片 | 亚洲视频网站在线观看 | 最近最新免费中文字幕8 | 欧美α一级毛片 | 精品国产人成亚洲区 | 亚州一二区 | 日韩 欧美 自拍 | 一本大道道无香蕉综合在线 | 日本天堂在线视频 | 亚洲综合视频在线 | 国产美女福利视频福利 | 波多野结衣久久高清免费 | 日韩欧美自拍 | 97精品国产91久久久久久 | 色欧美亚洲| 久久亚洲天堂 | 特黄的欧美毛片 | 精品视频在线观看 | 九一精品国产 | 国产精品无码久久综合网 | 成人97 | 国产精品自拍在线观看 | 日韩啊v| 精品国产不卡一区二区三区 | 正在播放国产露脸真实高清 | 欧美一区2区 | 最近最新中文字幕 | 日韩欧美毛片免费观看视频 | 日韩一区二区三区四区 | 亚洲精品国产专区一区 | 日本在线www |