【opencv004】highgui基础案例

1、首先对于前期配置好的Debug_x64_opencv320.props引入新项目的步骤如下

属性管理器->Debug|x64->添加现有属性表->将原先配置好的Debug_x64_opencv320引入->完成

2、本次共有四个简单的程序

2.1 用imwrite函数将图片保存在工程目录之下

imwrite_Function_Test

2.2 使用addWeighted函数将两个混合显示

mixImgOutput

2.3 使用createTrackbar函数创建Trackbar,并利用其改变两张图片的透明度

createTrackbar_function_test

2.4 使用setMouseCallBack函数读取鼠标操作,画框,保存

setMouseCallBack_function_test

3、下面是程序的源码注释和截图

3.1:imwrite_Function_Test


#include<opencv2/opencv.hpp>

#include<vector>

#include<iostream>

using namespace std;

using namespace cv;

//创建图片

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 - j)) /

                (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 可以在工程目录下查看由imwrite函数生成的图片\n");

        waitKey(0);

    }catch(runtime_error& ex) {

        fprintf(stderr,"图像转换成PNG格式发生错误:%s\n",ex.what());

        return 1;

    }

    return 0;

}

生成图片效果图:

工程目录中生成png文件:

3.2 mixImgOutput


#include <iostream>

#include<opencv2/opencv.hpp>

#include<opencv2/core/core.hpp>

#include<opencv2/highgui/highgui.hpp>

using namespace cv;

int main()

{

    Mat img1_SCUlogo = imread("SCULogo.jpg", 1);

    Mat img2_mountian= imread("test_img_1920x1080.jpg");

    //以下代码分别调用两个窗口显示两个图片

    namedWindow("【1】SCUlogo");

    imshow("【1】SCUlogo", img1_SCUlogo);

    namedWindow("【2】test_img_1920x1080.jpg");

    imshow("【2】test_img_1920x1080.jpg",img2_mountian);

    //创建Mat对象来进行相关操作

    Mat imageROI;

    imageROI = img2_mountian(Rect(800,100, img1_SCUlogo.cols, img1_SCUlogo.rows));

    /*

    如果创建一个Rect对象rect(100, 50, 50, 100),那么rect会有以下几个功能:

    rect.area();     //返回rect的面积 5000

    rect.size();     //返回rect的尺寸 [50 × 100]

    rect.tl();       //返回rect的左上顶点的坐标 [100, 50]

    rect.br();       //返回rect的右下顶点的坐标 [150, 150]

    rect.width();    //返回rect的宽度 50

    rect.height();   //返回rect的高度 100

    rect.contains(Point(x, y));  //返回布尔变量,判断rect是否包含Point(x, y)点

    */

    addWeighted(imageROI, 0.5, img1_SCUlogo, 0.3, 0., imageROI);

    //addWeighted()函数是将两张相同大小,相同类型的图片融合的函数。

    /*

    void cvAddWeighted(const CvArr * src1, double alpha, const CvArr * src2, double beta, double gamma, CvArr * dst);

        参数1:src1,第一个原数组.

        参数2:alpha,第一个数组元素权重

        参数3:src2第二个原数组

        参数4:beta,第二个数组元素权重

        参数5:gamma,图1与图2作和后添加的数值。不要太大,不然图片一片白。总和等于255以上就是纯白色了。

        参数6:dst,输出图片

    */

    namedWindow("【3】融合后的图片");

    imshow("【3】融合后的图片", img2_mountian);

    imwrite("【3】融合后的图片.jpg", img2_mountian);

    waitKey();

    return 0;

}

效果图:

3.3createTrackbar_function_test


#include<opencv2/opencv.hpp>

#include"opencv2/highgui/highgui.hpp"

#include <iostream>

using namespace cv;

#define WINDOWS_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;

void on_Trackbar(int,void*) {

    g_dAlphaValue = (double)g_nAlphaValueSlider/g_nMaxAlphaValue;//求出当前alpha值相对于最大值的比例

    g_dBetaValue = (1.0 - g_dAlphaValue);//则beta值为1减去alpha值

    //根据alpha值和beta值进行线性混合

    addWeighted(

        g_srcImage1,g_dAlphaValue,

        g_srcImage2,g_dBetaValue,

        0.0, g_dstImage);

    imshow(WINDOWS_NAME,g_dstImage);

}

int main() {

    //加载图像(两个图像的尺寸需要相同)

    g_srcImage1 = imread("test2_1920x1080.png");

    g_srcImage2 = imread("test1_1920x1080.png");

    if (!g_srcImage1.data) {

        printf("读取第1张图片错误,请确定目录下是否有imread函数制定图片存在\n"); return -1;

    }if (!g_srcImage2.data) {

        printf("读取第2张图片错误,请确定目录下是否有imread函数制定图片存在\n"); return -1;

    }

    //设置滑动条初始值为70

    g_nAlphaValueSlider = 70;

    //创建窗体

    namedWindow(WINDOWS_NAME,1);

    //在创建的窗体中创建一个滑动条控件

    char TrackbarName[50];

    sprintf(TrackbarName,"透明值 %d",g_nMaxAlphaValue);

    createTrackbar(TrackbarName,WINDOWS_NAME,

        &g_nAlphaValueSlider,g_nMaxAlphaValue,on_Trackbar);

    //结果在回调函数中显示

    on_Trackbar(g_nAlphaValueSlider,0);

    //按任意键退出

    waitKey(0);

    return 0;

}

效果图:(图片在不同比例下的显示效果)
trackbar效果图-1(100:0):

trackbar效果图-2(40:60):

trackbar效果图-3(0:100):

3.4 setMouseCallBack_function_test


#include<opencv2/opencv.hpp>

#include<opencv2/highgui/highgui.hpp>

#include <iostream>

#define WINDOW_NAME  "【程序窗口】"//为窗口定义的宏

using namespace std;

using namespace cv;

//以下是全局函数的声明

void on_MouseHandle(int event, int x, int y, int flags, void* param);

void DrawRectangle(cv::Mat& img, cv::Rect box);

//下面是全局变量的声明

Rect g_rectangle;

bool g_bDrawingBox = false;//是否进行绘制

RNG g_rng(12345);

int main() {

    //改变console字体颜色

    system("color 3F");

    //准备参数

    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)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: {

            //如果进行绘制的标识符为真,则记录下长和宽到RECT型变量中

            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;

            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(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)

        )

    );

}

绘制多个框图的效果图: