opencv3 学习笔记 第三章:

来源:互联网 发布:分支界限算法 编辑:程序博客网 时间:2024/06/05 16:53

opencv3 安装配置

参考《OpenCV3 编程入门》—毛星云 冷雪飞 等编著
本系列学习笔记纯属整理书本内容

#include <opencv2/opencv.hpp>using namespace cv;void main(){    printf("\t 当前使用的opencv版本为 OpenCV "CV_VERSION);//显示opencv版本    //读入图像    Mat srcImage=imread("1.jpg");      //Mat srcImage=imread("1.jpg",2|4); 读入无损图像    //Mat srcImage=imread("1.jpg",0); 读入灰度图像    //Mat srcImage=imread("1.jpg",1); 读入彩色图像    //创建窗口    namedWindow("【Window Name】",WINDOW_NORMAL);//默认,用户可改变窗口大小    // namedWindow("【Window Name】",WINDOW_AUTOSIZE);    //图片显示    imshow("[原始图]", srcImage);    //显示    //创建滑动条    createTrackbar("对比度", "【效果图窗口】", &g_nContrastValue, 300, onChange,[void* userdata=0]);    //改变对比度值g_nContrastValue(应为全局变量),最大可为300,回调函数为void onChange(int, void*)    //获取当前滑动条的位置    int getTrackbarPos("滑动条名字","窗口名字");    //鼠标操作    setMouseCallback("窗口名字",onMouse,[void* userdata=0]);    watiKey(0);}
  • 以下贴上原书代码:

  • 实例一:生成透明png图像

#include <vector>#include <stdio.h>#include<opencv2/opencv.hpp>using namespace cv;using namespace std;//      描述:创建带alpha通道的Matvoid 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( ){    //创建带alpha通道的Mat    Mat mat(480, 640, CV_8UC4);    createAlphaMat(mat);    ShowHelpText();    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/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;//      描述:响应滑动条的回调函数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);//addWeighted(图1,系数1,图2,系数2,+常数,存入图片)    //显示效果图    imshow( WINDOW_NAME, g_dstImage );}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( TrackbarName, "透明值 %d", g_nMaxAlphaValue );    createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );    //结果在回调函数中显示    on_Trackbar( g_nAlphaValueSlider, 0 );    //按任意键退出    waitKey(0);    return 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 DrawRectangle( cv::Mat& img, cv::Rect box );//      描述:全局变量的声明Rect g_rectangle;bool g_bDrawingBox = false;//是否进行绘制RNG g_rng(12345);//      描述:控制台应用程序的入口函数,我们的程序从这里开始执行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;}//      描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作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;    }}//      描述:自定义的矩形绘制函数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)));//随机颜色}
0 0
原创粉丝点击