C++手册(1) OpenCV

0. 前言

  • 在学习《Learning OpenCV 3》过程中的一些记录。

1. 展示窗口

1.1. 流水账

  • cv::namedWindow("Example1", cv::WINDOW_AUTOSIZE)
    • 构建窗口。
    • 第一个参数是框的名称,第二个用于尺寸参数。
  • cv::imshow("Example1", img)
    • 在窗口中展示图片。
    • 第一个参数用于选择定义过的 cv::namedWindow,第二个参数是图像对象,即cv::Mat对象。
  • cv::waitKey(0)
    • 停留在当前画面的时间。
    • 如果是0,则无限停留;如果是数字,则停留对应的毫秒。
    • 返回值是按下按钮的ASCII码。
  • cv::destroyWindow("Example1")
    • 关闭窗口。
    • 参数是窗口名称。

1.2. 应用

  • 创建窗口,显示图片,按键结束,销毁窗口。
    1
    2
    3
    4
    namedWindow("Example", cv::WINDOW_AUTOSIZE);
    imshow("Example", img);
    waitKey(0);
    destroyWindow("Example2-2");

2. 图像 & 视频

2.1. 基本对象

  • cv::Mat
    • 用于保存图片。
  • cv::VideoCapture
    • 用于保存视频。
  • cv::imread("/path/to/img", -1)
    • 读取图片。
    • 读一个参数是图片地址,第二个参数是图像颜色选择。
  • 视频对应的参数:
    • cv::CAP_PROP_POS_FRAMES:当前位置(在第几帧)。
    • cv::CAP_PROP_FRAME_WIDTH:图像宽度。
    • cv::CAP_PROP_FRAME_HEIGHT:图像高度。
    • cv::CAP_PROP_FRAME_COUNT:总帧数。
    • cv::cv::CAP_PROP_FPS:FPS。

2.2. 数字图像处理

  • cv::GaussianBlur
    • 高斯滤波。
  • cv::pyrDown() cv::pryUp()
    • 图像金字塔,其实就是按比例缩小变大。
  • cv::cvtColor(img_rgb, img_gry, cv::COLOR_BGR2GRAY)
    • 改变图像的color map。
    • 第一个参数是输入图像,第二个参数是输出图像,第三个参数是颜色变换目标。
    • 第一第二个参数都是cv::Mat对象。
  • cv::Canny
    • 边缘检测的一种算法。
  • cv::logPolar
  • cv::Point2f

2.3. 应用

  • 读取视频

    1
    2
    3
    4
    5
    6
    7
    8
    cv::VideoCapture cap;
    cap.open(std::string(argv[1]));

    cv::Mat frame;
    for(;;) {
    cap >> frame;
    if(frame.empty()) break;
    }
  • 获取/设置图像中某一位置的像素值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int x = 16, y = 32;
    cv::Mat img;
    img = cv::imread(argv[1]);

    # 设置某一位置的像素值
    img.at<uchar>(x, y) = 128;

    # 获取某一位置的像素值
    cv::Vec3b intensity = img.at<cv::Vec3b>(y, x);
    uchar blue = intensity[0];
    uchar green = intensity[1];
    uchar red = intensity[2];
  • 新建视频文件

    1
    2
    3
    4
    5
    6
    7
    8
    double fps = capture.get(cv::CAP_PROP_FPS);
    cv::Size size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH),
    (int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));
    cv::VideoWriter writer;
    writer.open(argv[2], CV_FOURCC('M', 'J', 'P', 'G'), fps, size);
    while True:
    ...
    writer << frame;