Opencv3笔记3——highGUI图形用户界面初步

1. 图像的载入imread()函数

Mat imread(const string filename, intflags = 1);

(1) filename支持的格式类型

  • Windows位图 .bmp,.dib
  • JPEG文件:.jpeg,.jpg,*.jpe
  • JPEG2000文件:*.jp2
  • PNG图片:*.png
  • 便携文件格式:*.pbm,*.pgm,*.ppm
  • Sun rasters 光栅文件:*.sr,*.ras
  • TIFF文件:*.tiff,*.tif
    (2)第二个参数

CV_LOAD_IMAGE_UNCHANGED = -1 已经忽略
CV_LOAD_IMAGE_GRAYSCALE = 0 将图像转换为灰度再返回
CV_LOAD_IMAGE_COLOR = 1转换图像为彩色
CV_LOAD_IMAGE_ANYDEPTH = 2 图像的深度为16或32.
CV_LOAD_IMAGE_COLOR|CV_LOAD_IMAGE_ANYCOLOR三通道图
CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR真实的图像
图像的格式为BGR

2.图像的显示imshow()函数

void imshow(const string & winname, InputArray mat);
  • 第一个为窗口的标识名称
  • 第二个为显示的图像

3. InputArray类型

4. namedWindow()函数

创建一个窗口

void namedWindow(const string & winname, int flags = WINDOW_AUTOSIZE)
  • 第一个为窗口的名称
  • 窗口的标识
    • WINDOW_NORMAL,设置这个值,用户可以改变窗口的大小
    • WINDOW_AUTOSIZE,自适应改变大小,用户不能改变
    • WINDOW_OPENGL支持openGL

destroyWindow()或destoryAllWindow()关闭窗口

5.输出图像到文件imwrite()函数

bool imwrite(const string & filename, InputArray img, const vector<int> & params=vector<int>());
  1. 文件名
  2. Mat类型的图像
  3. 第三个参数
    1. JPEG 这个参数从0-100表示图片的质量
    2. PNG表示压缩级别0-9
    3. 对于PPM,PGM,PBM取值为0或1
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
void creatAlpha(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通道的Mat
       Mat mat(480, 640, CV_8UC4);
       creatAlpha(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;
}

生成的图片
这里写图片描述

//-----------------------【头文件、命名空间包含部分】------------------
//                                描述:包含程序所使用的头文件和命名空间
//-----------------------------------------------------------------
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
       //---------------------------【一、图像的载入和显示】--------------------------------
       // 描述:完成图像载入和显示
       //--------------------------------------------------------------------------------
       Mat girl = imread("girl.jpg");    // 载入图像到Mat
       namedWindow("【1】动漫图");        //创建一个名为"【1】动漫图"的窗口
       imshow("【1】动漫图", girl);
       //--------------------------【二、初级图像混合】------------------------------------
       //     描述:初级图像混合
       //-------------------------------------------------------------------------------
       Mat image = imread("dota.jpg");
       Mat logo = imread("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图像输出到图像文件
       //--------------------------------------------------------------------
       imwrite("由imwrite生成的图片.jpg", image);
       waitKey();
       return 0;
}

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述

6. 轨迹条

这里写图片描述

#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);
}
//--------------------------------【main()函数】--------------------
//     描述:控制台应用程序的入口函数
//-----------------------------------------------------------------
int main(int argc, char ** argv)
{
       //加载图像 (两图像的尺寸需相同)
       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;
       }
       // 设置滑动条的初值为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;
}

这里写图片描述
这里写图片描述
这里写图片描述

获取当前轨迹条的位置:

int getTrackbarPos(conststring & trackbarname, conststring & winname);
  1. trackbarname轨迹条的名字
  2. winname,轨迹条父窗口的名称

鼠标的操作

void SetMouseCallbacck(conststring & winname, MouseCallback onMouse, void * userdata = 0);
  1. 窗口的名字
  2. onMouse,指定窗口里每次鼠标时间发生的时候,被调用的函数指针。
    1. void Foo(int event, int x, int y, int flags, void * param)
    2. event 是EVENT_+变量之一
    3. x和y是鼠标指针在图像坐标系中的坐标值
    4. flag是EVENT_FLAG的组合
    5. param是用户定义的传递到SetMouseCallback函数调用函数
  3. void * 类型的userdata,用户定义的传递到回调函数的参数,默认值为0
#include <opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME "【程序窗口】"
//--------------------【全局函数声明部分】---------------------
//     描述:全局函数的声明
//----------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void * param);
void DrawRactangle(Mat & img, Rect box);
void ShowHelpText();
//---------------------【全局变量声明部分】--------------------
//     描述:全局变量的声明
//----------------------------------------------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);
int main(int argc, char ** argv)
{
       //准备参数
       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);
       // 设置鼠标操作回调函数
       namedWindow(WINDOW_NAME);
       setMouseCallback(WINDOW_NAME, on_MouseHandle, (void *)&srcImage);
       // 程序主循环,当进行绘制的标识符为真的时候进行绘制
       while (1)
       {
              srcImage.copyTo(tempImage);       // 复制源图到临时变量
              if (g_bDrawingBox)
              {
                     DrawRactangle(tempImage, g_rectangle);   //进行绘制
              }
              imshow(WINDOW_NAME, tempImage);
              if (waitKey(10) == 27)            // 按下ESC键,程序退出
                     break;
       }
       return 0;
}
//------------------------【on_MouseHandle(函数)】------------
//     描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
//-----------------------------------------------------------
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)   //如果是否进行绘制的标识符为真,则记录下长和宽到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:
       {
              // 标识符为false
              g_bDrawingBox = 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;
              }
              //调用函数进行绘制
              DrawRactangle(image, g_rectangle);
       }
       break;
       }
}
void DrawRactangle(Mat & img, Rect box)
{
       // tl(top left) br(below right)
       rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0,255), g_rng.uniform(0,255), g_rng.uniform(0,255)));
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/huayunhualuo/article/details/81329675