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");
}