opencv 1 HighGUI图形用户界面初步

1图像载入 显示和输出到文件

Opencv的命名空间

1589120-20190709085049978-1412707746.png

Mat类

1589120-20190709085740968-1114811579.png

图像的载入:imread()函数

1589120-20190709085958923-1005866264.png
1589120-20190709090443321-1316655982.png
1589120-20190709090758185-454856245.png
1589120-20190709091030585-1731235514.png
1589120-20190709091255235-460478416.png

图片的显示:imshow()函数

1589120-20190709092950342-1931676648.png

创建窗口:namedWindow()函数

1589120-20190709104204270-906990118.png
1589120-20190709104224354-515161446.png

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

1589120-20190709105236435-1432238429.png

#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()函数)

1589120-20190709150428112-1349287032.png
1589120-20190709155607304-1142308217.png
1589120-20190709160056325-1131395810.png

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

1589120-20190709163530460-1260759425.png

鼠标操作

1589120-20190709164811195-682843596.png
1589120-20190709164848515-117522078.png

实例
//--------------------------------------【程序说明】-------------------------------------------
//      程序说明:《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");

}

转载于:https://www.cnblogs.com/xingkongcanghai/p/11155248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值