1.圖像的載入、顯示和輸出到文件
1.1 圖像的載入:imread()函數(shù)
Mat imread(const string &filename,int flags=1)
- 第一個(gè)參數(shù):圖片路徑
- 第二個(gè)參數(shù):載入標(biāo)識(shí),指定一個(gè)加載圖像的顏色類型。可以看到它自帶的默認(rèn)值為1
1.2 圖像的顯示:imshow()函數(shù)
void imshow(const string& winname InputArray mat)
- 第一個(gè)參數(shù):填需要顯示的窗口標(biāo)識(shí)名稱
- 第二個(gè)參數(shù):填需要顯示的圖像
1.3 創(chuàng)建窗口:namedWindow()函數(shù)
void namedWindow(const string &winname, int flags=WINDOW_AUTOSIZE)
- 第一個(gè)參數(shù):窗口名稱
- 第二個(gè)參數(shù):窗口的標(biāo)識(shí),可以設(shè)置以下幾個(gè)值
WINDOW_NORMAL:用戶可以改變窗口大小
WINDOW_AUTOSIZE:窗口大小會(huì)自動(dòng)調(diào)整使用圖片的大小,用戶不能手動(dòng)改變窗口的大小
WINDOW_OPENGL:窗口創(chuàng)建的時(shí)候會(huì)支持OPENGL
1.4 輸入圖像到文件:imwrite()函數(shù)
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() )
- 第一個(gè)參數(shù): 填寫要寫入的文件名,帶上后綴,如123.jpg
- 第二個(gè)參數(shù):一般填一個(gè)Mat類型的圖像數(shù)據(jù)
- 第三個(gè)參數(shù):表示為特定格式保存的參數(shù)編碼
1.5綜合案例代碼
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main() {
//---------------------1.圖像的載入和顯示---------------------
Mat girl = imread("../../image/girl.jpg"); //載入圖像到Mat
namedWindow("【1】動(dòng)漫圖", WINDOW_NORMAL); //創(chuàng)建一個(gè)名為 [1]動(dòng)漫圖 的窗口
imshow("【1】動(dòng)漫圖", girl); //顯示名為“【1】動(dòng)漫圖”的窗口
//-----------------------2.初級(jí)圖像混合------------------------
Mat dota= imread("../../image/dota.jpg");
Mat logo = imread("../../image/logo.jpg");
//載入后顯示
namedWindow("【2】dota",WINDOW_NORMAL);
imshow("【2】dota", dota);
namedWindow("【3】logo", WINDOW_NORMAL);
imshow("【3】logo", logo);
//定義一個(gè)Mat類型,用于存放圖像的ROI
Mat imageROI;
//方法一
imageROI = dota(Rect(800, 350, logo.cols, logo.rows));
//方法二
dota(Range(350, 350 + logo.rows), Range(800, 800 + logo.cols));
//將image2加到image1上
addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);
//顯示結(jié)果
namedWindow("【4】dota+logo", WINDOW_NORMAL);
imshow("【4】dota+logo", dota);
//-------------------------------3.圖像的輸出----------------------------
//將一個(gè)Mat圖像輸出到圖像文件
imwrite("由imrite生成的圖片.jpg", dota);
waitKey(0);
return 0;
}
2. 滑動(dòng)條的創(chuàng)建和使用
2.1 創(chuàng)建滑動(dòng)條:createTrackbar()函數(shù)
int createTrackbar(const string& trackbarname , const string& winname , int* value , int count, TrackbarCallback onChange=0 , void* userdata=0);
- 第一個(gè)參數(shù):軌跡條的名字
- 第二個(gè)參數(shù):窗口的名字
- 第三個(gè)參數(shù):一個(gè)指向整形的指針,表示滑塊的位置。在創(chuàng)建時(shí),滑塊的初始位置就是該變量當(dāng)前的值。
- 第四個(gè)參數(shù):表示滑塊可以達(dá)到的最大值?;瑝K最小位置的值始終為0;
2.2 滑動(dòng)條案例
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
#define WINDOW_NAME "【線性混合示例】" //為窗口標(biāo)題定義的宏
//---------------------全局變量聲明部分---------------------
const int g_nMaxAlphaValue = 100; //Alpha的最大值
int g_nAlphaValueSlider; //滑動(dòng)條對(duì)應(yīng)的變量
double g_dAlphaValue;
double g_dBetaValue;
//聲明存儲(chǔ)圖像的變量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
//--------------------on_Trackbar()函數(shù)---------------------
//相應(yīng)滑動(dòng)條的回調(diào)函數(shù)
void on_Trackbar(int, void*) {
//求出當(dāng)前alpha值相當(dāng)于最大值的比例
g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
//則beta值為1-alpha的值
g_dBetaValue = (1.0 - g_dAlphaValue);
//根據(jù)alpha和beta值進(jìn)行線性混合
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//顯示效果圖
imshow(WINDOW_NAME, g_dstImage);
}
int main() {
//加載圖像
g_srcImage1 = imread("../../image/1.tif");
g_srcImage2 = imread("../../image/2.tif");
if (!g_srcImage1.data) {
cout << "讀取第一幅圖片失敗" << endl;
return -1;
}
if (!g_srcImage2.data) {
cout << "讀取第二幅圖片失敗" << endl;
return -1;
}
//設(shè)置滑動(dòng)條初值為70
g_nAlphaValueSlider = 70;
//創(chuàng)建窗體
namedWindow(WINDOW_NAME, 1);
//在創(chuàng)建的窗體中創(chuàng)建一個(gè)滑動(dòng)條控件
char TrackbarName[50];
sprintf_s(TrackbarName, "透明值%d", g_nMaxAlphaValue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider,
g_nMaxAlphaValue, on_Trackbar);
//結(jié)果在回調(diào)函數(shù)中顯示
on_Trackbar(g_nAlphaValueSlider, 0);
waitKey(0);
return 0;
}
2.3 獲取當(dāng)前軌跡條的位置:getTrackbarPos()函數(shù)
該函數(shù)是配合createTrackbar使用的函數(shù),它用于獲取當(dāng)前軌跡條的位置。int getTrackbarpos(const string& trackbarname,const string& winname);
- 第一個(gè)參數(shù):表示軌跡條的名字
- 第二個(gè)參數(shù):表示軌跡條的父窗口的名稱
3.鼠標(biāo)操作
OpenCV中的鼠標(biāo)操作和滑動(dòng)條的消息映射方式很類似,都是通過一個(gè)中介函數(shù)配合一個(gè)回調(diào)函數(shù)來實(shí)現(xiàn)的。void setMousecCallback(const string &winname,MouseCallback onMouse,void* userdata=0)
文章來源:http://www.zghlxwxcb.cn/news/detail-481321.html
- 第一個(gè)參數(shù):窗口的名稱
- 第二個(gè)參數(shù):指定窗口里每次鼠標(biāo)時(shí)間發(fā)生的時(shí)候,被調(diào)用的函數(shù)指針。
3.1 鼠標(biāo)操作案例
#include<opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME "【程序窗口】"
//----------------------------全局函數(shù)聲明-----------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(Mat& img, Rect box);
void ShowHelpText();
//-------------------------全局變量聲明部分-----------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//是否進(jìn)行繪制
RNG g_rng(12345);
int main() {
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);
//設(shè)置鼠標(biāo)操作回調(diào)函數(shù)
namedWindow(WINDOW_NAME);
setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)& srcImage);
//循環(huán),當(dāng)進(jìn)行繪制的標(biāo)識(shí)符為真時(shí),進(jìn)行繪制
while (1) {
srcImage.copyTo(tempImage); //復(fù)制原圖到臨時(shí)變量
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 flag, void* param) {
Mat& image = *(Mat*)param;
switch (event) {
//鼠標(biāo)移動(dòng)消息
case EVENT_MOUSEMOVE:
{
if (g_bDrawingBox)//如果是否進(jìn)行繪制的標(biāo)識(shí)為真,則記錄下長和寬到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);//記錄起始點(diǎn)
}
break;
//左鍵松開
case EVENT_LBUTTONUP:
{
g_bDrawingBox = false;//置標(biāo)識(shí)符為false
//對(duì)寬和高小于的0處理
if (g_rectangle.width < 0) {
g_rectangle.x += g_rectangle.width;
g_rectangle.width *= -1;
}
if (g_rectangle.height < 0) {
g_rectangle.x += g_rectangle.height;
g_rectangle.height *= -1;
}
//調(diào)用繪制函數(shù)
DrawRectangle(image, g_rectangle);
}
break;
}
}
//------------------------DrawRectangle()函數(shù)------------------------
void DrawRectangle(Mat& img, Rect box) {
rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),
g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//設(shè)置隨機(jī)顏色
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-481321.html
到了這里,關(guān)于快速上手Opencv:HighGUI圖形用戶界面的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!