opencv基础知识学习 -- 代码练习二

------------恢复内容开始------------

------------恢复内容开始------------

// 图像像素的算术操作
void CV120201012Dlg::pixelOperator()
{
    Mat m1 = imread("E:\\壁纸\\周震南\\微信图片_20200610160556.jpg");
    // 定义变量接收操作之后的图像
    Mat img;
    img = m1 + Scalar(50,50,50);  // - / 都可以, * 需要使用opencv 的 API 函数
    /*namedWindow("图像像素算术操作", WINDOW_AUTOSIZE);
    imshow("图像像素算术操作",img);*/

    // 两幅图像相乘
    Mat m2 = Mat::zeros(m1.size(),m1.type());
    m2 = Scalar(2,2,2);
    // 乘法  
    multiply(m1,m2,img);
    namedWindow("图像像素算术操作 乘法", WINDOW_AUTOSIZE);
    imshow("图像像素算术操作 乘法", img);
    // 除法
    divide(m1, m2, img);
    namedWindow("图像像素算术操作 除法", WINDOW_AUTOSIZE);
    imshow("图像像素算术操作 除法", img);
    m2 = Scalar(59, 50, 52);  // 为使得效果更明显 加大数值
    // 减法
    subtract(m1, m2, img);
    namedWindow("图像像素算术操作 减法", WINDOW_AUTOSIZE);
    imshow("图像像素算术操作 减法", img);
    // 加法
    add(m1, m2, img);
    namedWindow("图像像素算术操作 加法", WINDOW_AUTOSIZE);
    imshow("图像像素算术操作 加法", img);
    
    
    /*
        saturate_cast<uchar>();
        可防止 ()中的运算 溢出, <0时 =0   >255时=255
    */

    waitKey(0);
}



// 滚动条练习  使用滚动条改变图像亮度
// 响应函数

static void onTrack(int b,void*)
{
    // 对图像进行 算术操作
    Mat m1 = imread("E:\\壁纸\\虎太郎\\timg.jpg");
    Mat m2 = Mat::zeros(m1.size(), m1.type());
    m2 = Scalar(b, b, b);
    // 定义变量接收操作之后的图像
    Mat img;
    // 加法
    add(m1, m2, img);
    namedWindow("滚动条", WINDOW_AUTOSIZE);
    imshow("滚动条", img);
    //waitKey(0);   // 不能添加,添加后滚动条的数据显示不会更新
}
void CV120201012Dlg::trackingBar()
{
    // 定义一个窗口用来显示图像和滚动条
    namedWindow("滚动条", WINDOW_NORMAL);
    // 定义一个滚动条
    int lightValue = 50;
    int maxValue = 100;
    createTrackbar("Value", "滚动条", &lightValue,maxValue,onTrack);
    onTrack(50,0);  // 如果不加这句话,运行后显示的是一幅灰图像,拖动滚动条才显示正常图像
}

// 键盘响应操作
void CV120201012Dlg::keyboardDemo()
{
    // 定义一个变量来接收键盘按下的值
    
    Mat m = imread("E:\\壁纸\\周震南\\微信图片_20200610160556.jpg");
    if (m.empty())
    {
        MessageBox(_T("图像加载失败!"), _T("error"));
        return;
    }
    Mat img = m.clone();
    while (1)
    {
        int key = waitKey(100);
        if (key == 27)
        {
            break;
        }
        else if (key == 49)
        {
            cvtColor(m,img,COLOR_BGR2GRAY);
        }
        else if (key == 50)
        {
            cvtColor(m, img, COLOR_BGR2HSV);
        }
        else if (key == 51)
        {
            m = m + Scalar(50,50,50);
            img = m.clone();
        }
        namedWindow("键盘响应", WINDOW_NORMAL);
        imshow("键盘响应", img);
    }
}

// 颜色图
void CV120201012Dlg::colorMap()
{
    // 读取一张图像
    Mat m = imread("E:\\壁纸\\周震南\\微信图片_20200610160556.jpg");
    Mat img = Mat::zeros(m.size(),m.type());
    // 定义颜色表数组
    int m_colorMap[] = {
        COLORMAP_AUTUMN , //!< ![autumn](pics/colormaps/colorscale_autumn.jpg)
    COLORMAP_BONE , //!< ![bone](pics/colormaps/colorscale_bone.jpg)
    COLORMAP_JET , //!< ![jet](pics/colormaps/colorscale_jet.jpg)
    COLORMAP_WINTER , //!< ![winter](pics/colormaps/colorscale_winter.jpg)
    COLORMAP_RAINBOW, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg)
    COLORMAP_OCEAN , //!< ![ocean](pics/colormaps/colorscale_ocean.jpg)
    COLORMAP_SUMMER , //!< ![summer](pics/colormaps/colorscale_summer.jpg)
    COLORMAP_SPRING , //!< ![spring](pics/colormaps/colorscale_spring.jpg)
    COLORMAP_COOL , //!< ![cool](pics/colormaps/colorscale_cool.jpg)
    COLORMAP_HSV , //!< ![HSV](pics/colormaps/colorscale_hsv.jpg)
    COLORMAP_PINK , //!< ![pink](pics/colormaps/colorscale_pink.jpg)
    COLORMAP_HOT , //!< ![hot](pics/colormaps/colorscale_hot.jpg)
    COLORMAP_PARULA , //!< ![parula](pics/colormaps/colorscale_parula.jpg)
    COLORMAP_MAGMA , //!< ![magma](pics/colormaps/colorscale_magma.jpg)
    COLORMAP_INFERNO , //!< ![inferno](pics/colormaps/colorscale_inferno.jpg)
    COLORMAP_PLASMA , //!< ![plasma](pics/colormaps/colorscale_plasma.jpg)
    COLORMAP_VIRIDIS , //!< ![viridis](pics/colormaps/colorscale_viridis.jpg)
    COLORMAP_CIVIDIS , //!< ![cividis](pics/colormaps/colorscale_cividis.jpg)
    COLORMAP_TWILIGHT , //!< ![twilight](pics/colormaps/colorscale_twilight.jpg)
    COLORMAP_TWILIGHT_SHIFTED , //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg)
    COLORMAP_TURBO  , //!< ![turbo](pics/colormaps/colorscale_turbo.jpg)
    COLORMAP_DEEPGREEN   //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg)
    };
    if (m.empty())
    {
        MessageBox(_T("图像加载失败!"), _T("error"));
        return;
    }
    int index = 0;
    while (1)   // 循环显示
    {
        int key = waitKey(1000);  // 2 s一刷新
        if (key == 27)
        {
            break;
        }
        
        applyColorMap(m,img, m_colorMap[index%21]);
        index++;

        namedWindow("颜色表", WINDOW_NORMAL);
        imshow("颜色表", img);
        if (key == 83 || key == 115)  // 按下 s 键  保存当前图像
        {
            std::stringstream filename;
            filename << "E:\\壁纸\\colorMap\\" << index <<"--"<< m_colorMap [index%21]<< ".jpg";
            imwrite(filename.str(),img);
        }
    }
}
//图像位操作
void CV120201012Dlg::bitwiseDemo()
{
    // 创建俩张图像
    Mat m1 = Mat::zeros(Size(255,255),CV_8UC3);
    Mat m2 = Mat::zeros(Size(255, 255), CV_8UC3);
    // 使用 rectangle 来绘制图像
    rectangle(m1,Rect(150,150,80,80),Scalar(255,255,0),-1,LINE_8,0);
    rectangle(m2, Rect(200, 200, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);  // -1 填充 >0 绘制(描边)

    // 运算
    Mat img;
    bitwise_and(m1,m2,img);
    imshow("与运算", img);
    bitwise_or(m1, m2, img);
    imshow("或运算", img);
    bitwise_xor(m1, m2, img);
    imshow("异或运算", img);
    bitwise_not(m2, img);
    imshow("非运算", img);

}
// 通道混合
void CV120201012Dlg::channelDemo()
{
    Mat m = imread("E:\\壁纸\\周震南\\微信图片_20200610160556.jpg");
    if (m.empty())
    {
        MessageBox(_T("图像加载失败!"), _T("error"));
        return;
    }
    //分离通道
    // 接收分离后通道的数组
    std::vector<Mat> chan;
    split(m,chan);

    imshow("蓝色B", chan[0]);
    imshow("绿色G", chan[1]);
    imshow("红色R", chan[2]);

    // 将单通道混合
    Mat m1 = Mat::zeros(m.size(),m.type());
    chan[0] = 0;
    chan[1] = 0;

    //  通道混合
    int chanArry[] = {1,2,0,1,2,2};
    mixChannels(m,m1, chanArry,3);

    imshow("通道混合", m1);

}

------------恢复内容结束------------

------------恢复内容结束------------

posted @ 2020-10-19 23:18  南南子  阅读(61)  评论(0)    收藏  举报