OpenCV学习笔记

OpenCV学习笔记

图像显示

在新版OpenCv当中,图像显示只需要使用imread函数载入到数据结构Mat类中,然后用imshow函数显示即可。

其中imread函数支持的图形格式有:

  • windows位图:*.bmp, *.dib
  • JPEG文件:*.jpeg, *.jpg, *.jpe
  • JPEG2000文件:*jp2
  • PNG图片:*.png
  • 便捷文件格式:*.pbm, *.pgm, *.ppm
  • Sun rasters 光栅文件:*.sr, *.ras
  • TIFF文件:*.tiff, *.tif
 Mat srcImg = imread("/Users/william/Desktop/test.png",2 | 4);//载入无损的源图像
 Mat srcImg = imread("/Users/william/Desktop/test.png",0);//载入灰度图
 Mat srcImg = imread("/Users/william/Desktop/test.png",199);//载入3通道的彩色图像

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 
#include 

using namespace cv;


//图像显示
int main(int argc, const char * argv[]) {
    
    //载入原图
    Mat srcImg = cv::imread("/Users/william/Desktop/test.png");//载入
    imshow("【原始图】", srcImg);//显示
    waitKey(0);//等待
}

图像腐蚀

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include  // OpenCV highgui模块
#include  // OpenCV图像处理模块

using namespace cv;

// 图像腐蚀
int main(int argc, const char * argv[]) {
    // 载入原图
    Mat srcImg = cv::imread("/Users/william/Desktop/test.png");
    imshow("【原图】腐蚀操作", srcImg);
    // 进行腐蚀操作
    Mat element = getStructuringElement(MORPH_RECT, Size(15,15));
    waitKey(0);
    // 其中,getStructuringElement函数返回指定形状和尺寸的结构元素(内核矩阵)。
    Mat dstImg;
    //图像腐蚀操作
    erode(srcImg, dstImg, element);
    // 显示效果图
    imshow("【效果图】腐蚀", dstImg);
    waitKey(0);
    return 0;
}

图像模糊

图像模糊,主要使用均值滤波来实现blur效果。

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include  // OpenCV highgui模块
#include  // OpenCV图像处理模块

using namespace cv;

// @brief   图像模糊,主要使用均值滤波操作,
int main(int argc, const char * argv[]) {
    // 载入原图
    Mat srcImg = cv::imread("/Users/william/Desktop/test.png");
    imshow("【原图】图像模糊操作", srcImg);
    Mat dstImg;
  	 // 模糊
    blur(srcImg, dstImg, Size(10, 10));
    // 显示效果图
    imshow("【效果图】腐蚀", dstImg);
    waitKey(0);
    return 0;
}

canny边缘检测

将原图转换成灰度图之后,使用blur函数进行图形模糊来降噪,然后使用canny函数进行边缘检测。

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 
#include  // OpenCV highgui模块

using namespace cv;

// @brief   canny边缘检测
int main(int argc, const char * argv[]) {
    // 载入原图
    Mat srcImg = cv::imread("/Users/william/Desktop/test.png");
    imshow("【原图】canny边缘检测操作", srcImg);
    waitKey(0);
    Mat edgeImage,grayImage;
    // 原始图转为灰度图
    cvtColor(srcImg, grayImage, CV_BGR2GRAY);
    waitKey(0);
    // 显示灰度图
    imshow("【灰度图】", grayImage);
    //保存到本地
    imwrite("/Users/william/Desktop/grayImage.png", grayImage);
    waitKey(0);
    // 使用3*3内核来降噪
    blur(grayImage, edgeImage, Size(3, 3));
    // 运行Canny算子
    Canny(edgeImage, edgeImage, 3, 9, 3);
    // 显示效果图
    imshow("【效果图】边缘检测", edgeImage);

    imwrite("/Users/william/Desktop/edgeImage.png", edgeImage);
    waitKey(0);
    return 0;
}

读取并且播放视频

定义Mat变量,用于存储每一帧的图形,接着读取当前帧到Mat变量中,然后调用imshow显示当前的这一帧的图像

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 

using namespace cv;

// @brief   读取斌给播放视频
int main(int argc, const char * argv[])
{
    // 读取视频
    VideoCapture capture("/Users/william/Desktop/Record.mp4");
    
    // 循环显示每一帧
    while(1)
    {
        Mat frame; // 用于存储每一帧的图像
        capture>>frame;
        
        // 若视频播放完成,则退出循环
        if (frame.empty())
        {
            break;
        }
        
        imshow("读取视频", frame);
        waitKey(30);
    }
    return 0;
}

生成一张png图片并且保存

生成一张rgba都为0的图

void createAlphaMat(Mat& mat)
{
    for (int i = 0; i < mat.rows; ++i) {
        for (int j = 0; j < mat.cols; ++j) {
            Vec4b& rgba = mat.at(i,j);
            rgba[0] = 0.0f;
            rgba[1] = 0.0f;
            rgba[2] = 0.0f;
            rgba[3] = 0.0f;
        }
    }
}
//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 
#include 
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(i,j);
            rgba[0] = UCHAR_MAX;
            rgba[1] = saturate_cast((float (mat.cols - j)) / (float (mat.cols)) * UCHAR_MAX);
            rgba[2] = saturate_cast((float (mat.rows - i)) / (float (mat.rows)) * UCHAR_MAX);
            rgba[3] = saturate_cast(0.5 * (rgba[1] + rgba[2]));
        }
    }
}


// @brief   生成一张png图片并且保存
int main(int argc, const char * argv[]) {
    
    //创建带alpha通道的Mat
    Mat mat(480,640,CV_8UC4);
    createAlphaMat(mat);
    
    std::vector compression_params;
    // openvc 3 version
    compression_params.push_back(IMWRITE_PNG_BILEVEL);
    try {
        imwrite("/Users/william/Desktop/透明alpha值图.png", mat, compression_params);
        imshow("生成的透明PNG图",mat);
        std::fprintf(stdout, "save image successful!");
        waitKey(0);
    } catch (std::runtime_error& ex) {
        std::fprintf(stderr, "图像转png格式发生错误:%s",ex.what());
        return 1;
    }
    return 0;
}

初级图像混合,输入,输出,保存

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 
#include 
#include 

using namespace cv;

// @brief   初级图像混合,输入,输出,保存
int main(int argc, const char * argv[]) {
    
    Mat srcImage = imread("/Users/william/Desktop/testImage/test.png",1);
    Mat background = imread("/Users/william/Desktop/testImage/background.png",1);
    if (!background.data) {
        printf("读取图片srcImage失败!");
        return -1;
    }
    if (!srcImage.data) {
        printf("读取图片srcImage2失败!");
        return -1;
    }
    namedWindow("初级混合");
    // 存放图片
    Mat imageROI;
    imageROI = background(Rect(0,0,srcImage.cols,srcImage.rows));
    //  imageROI = srcImage(Range(350, 350 + srcImage2.rows), Range(800, 800 + srcImage2.cols));
    //  此处有两种写法
    addWeighted(imageROI, 0.5, srcImage, 0.3, 0.0, imageROI);
    namedWindow("混合图");
    imshow("混合图",background);
    imwrite("/Users/william/Desktop/testImage/混合图.png", background);
    waitKey(0);
    return 0;
}

滑动条的创建和使用

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 
#include 
using namespace cv;

const int g_nMaxAlphaValue = 100;// Alpha 值的最大值
int g_nAlphaValueSlider;// 滑动条对应的变量
double g_dAlpahValue;
double g_dBetaValue;

//声明个存储图像的变量

Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;

// @brief 相应滑动条的回调函数
void on_Trackbar(int, void*)
{
    // 求出当前alpha值相对与最大值的比例
    g_dAlpahValue = (double) g_nAlphaValueSlider / g_nMaxAlphaValue;
    // 则beta值为1减去alpha值
    g_dBetaValue = (1.0f - g_dAlpahValue);
    
    // 根据alpha和beta值进行线性混合
    addWeighted(g_srcImage1, g_dAlpahValue, g_srcImage2, g_dBetaValue, 0.0f, g_dstImage);
    
    // 显示效果图
    imshow("Trackbar", g_dstImage);
}

// @brief   滑动条的创建和使用
int main(int argc, const char * argv[])
{
    // 加载图像(两图像的尺寸需要相同)
    g_srcImage1 = imread("/Users/william/Desktop/testImage/test.png",1);
    g_srcImage2 = imread("/Users/william/Desktop/testImage/test2.png",1);
    if (!g_srcImage1.data) {
        printf("读取g_srcImage1失败");
        return -1;
    }
    if (!g_srcImage2.data) {
        printf("读取g_srcImage2失败");
        return -1;
    }
    // 设置滑动条初值为70
    g_nAlphaValueSlider = 70;
    
    // 创建窗口
    namedWindow("Trackbar",1);
    char TrackbarName[50];
    sprintf(TrackbarName, "alpha: %d",g_nMaxAlphaValue);
    createTrackbar(TrackbarName, "Trackbar", &g_nAlphaValueSlider, g_nMaxAlphaValue,on_Trackbar);
    // 结果回调函数中显示
    on_Trackbar(g_nAlphaValueSlider, 0);
    //获取当前轨迹调的位置并且返回
    int TrackPosition = getTrackbarPos("Trackbar", "Trackbar");
    printf("TrackPosition:%d",TrackPosition);
    waitKey(0);
    return 0;
}

Mat创建位图

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 
#include 
using namespace cv;

// @brief   Mat创建位图
int main(int argc, const char * argv[])
{
    Mat M(80, 100, CV_8UC3, Scalar(255.0f, 0.0f ,255.0f,1.0f));
    std::cout << "M = " << std::endl << "   " << M << std::endl<< std::endl ;
    imshow("test", M);
    imwrite("/Users/william/Desktop/testImage/testSave.png",M);
    waitKey(0);
    return 0;
}

图像对比度、亮度值调整

//
//  main.cpp
//  OpenCvDemo
//
//  Created by william on 2019/1/2.
//  Copyright © 2019 william. All rights reserved.
//
#include 
#include 
#include 
using namespace cv;

//全局函数声明
static void on_ContrastAndBright(int, void*);
static void ShowHelpText();

//全局变量声明
const int g_nMaxContrastValue = 100;// Contrast 值的最大值
const int g_nMaxBrightValue = 100;// Bright 值的最大值
int g_nContrastValue;//对比度值
int g_nBrightValue;//亮度值
Mat g_srcImage,g_dstImage;

// @brief   图像对比度、亮度值调整
int main(int argc, const char * argv[])
{
    // 读取
    g_srcImage = imread("/Users/william/Desktop/testImage/test.png",1);
    if (!g_srcImage.data) {
        printf("g_srcImage is not excit!");
    }
    g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());
    
    g_nContrastValue = 80;
    g_nBrightValue = 100;
    
    // 创建效果图窗口
    namedWindow("ContrastValueAndBright",1);
    char TrackbarName1[50];
    char TrackbarName2[50];
    sprintf(TrackbarName1, "ContrastValue: %d", g_nMaxContrastValue);
    sprintf(TrackbarName2, "BrightValue: %d", g_nMaxBrightValue);
    //创建轨迹条
    createTrackbar(TrackbarName1, "Contrast", &g_nContrastValue, 300, on_ContrastAndBright);
    createTrackbar(TrackbarName2, "Bright", &g_nBrightValue, 200, on_ContrastAndBright);
    
    //进行回调函数初始化
    on_ContrastAndBright(g_nContrastValue, 0);
    on_ContrastAndBright(g_nBrightValue, 0);
    
    //按下”q“键时,程序退出
    while (char(waitKey(1)) != 'q' ) {}
    return 0;
}


void on_ContrastAndBright(int, void*){
    namedWindow("srcImage",1);
    //三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b;
    for (int y = 0; y < g_srcImage.rows ; ++y)
    {
        for (int x = 0; x < g_srcImage.cols; ++x) {
            for (int c = 0; c < 3; ++c) {
                g_dstImage.at(y,x)[c] = saturate_cast((g_nContrastValue*0.01) * (g_srcImage.at(y,x)[c] + g_nBrightValue));
            }
        }
    }
    imshow("origin", g_srcImage);
    imshow("effect", g_dstImage);
}

你可能感兴趣的:(C++)