OpenCV3学习笔记

参数名称

cv::CAP_PROP_POS_FRAMES等宏变量,里面的PROP是property的缩写,代表的是视频流文件的具体文件性质。
cv::WINDOW_AUTOSIZE会将窗口缩放为与视频中图像的尺寸相同的大小。
cv::WINDOW_NORMAL,会将窗口放大到全屏幕大小,如果图像的尺寸不够,就会自动进行缩放,放大的效果就像马赛克、模糊一样。

视频

视频输出

从摄像机打开的视频流,使用.get获取到的帧数为零帧。如果希望成功写出到视频文件中,需要自己指定视频的帧率。

    cv::VideoCapture capture;
    capture.open( 0 );
    double fps = capture.get( cv::CAP_PROP_FPS );
    // 此时,fps = 0.
    if(fps == 0){ // 摄像头的话,获取到的帧率为零。为了能够输出视频,需要自己设置帧率。
        fps = 24; // 设置帧率。fps: frames per second.
    }
    cv::Size size(
        (int)capture.get( cv::CAP_PROP_FRAME_WIDTH ),
        (int)capture.get( cv::CAP_PROP_FRAME_HEIGHT )
    );
    cv::VideoWriter writer;
    writer.open( "output-log-polar.mp4", CV_FOURCC('M', 'J', 'P', 'G'), fps, size ); // 帧率不为零,才能正常输出视频。

章节练习

第二章

2.0

浏览库的主要部分:core模块包含基础数据类型以及算法,imgproc模块包含图像处理和视频处理算法,ml模块包含机器学习和聚类算法,highgui模块包含输入输出功能。

以上几个文件夹所在位置分别是:

所有模块应该参见sources/modules文件夹下的各个子文件夹:
C:\software\opencv3\opencv\sources\modules
core模块:
C:\software\opencv3\opencv\sources\modules\core
imgproc模块:
C:\software\opencv3\opencv\sources\modules\imgproc
ml模块:
C:\software\opencv3\opencv\sources\modules\ml
highgui模块:
C:\software\opencv3\opencv\sources\modules\highgui

检查…/samples/cpp文件夹,那里有许多有用的例子。

samples/cpp文件夹所在路径为:

C:\software\opencv3\opencv\sources\samples\cpp
2.1

使用这本书或者http://opencv.org所提供的安装、构建指令,在debug模式和release模式下编译这个库。这也许会花一些时间,但是你需要编译得到的库和dll文件。同时注意设置cmake编译位于…/opencv/samples/文件夹下的例子。

这里说的debug模式和release模式不清楚是什么意思,但是我已经成功编译出opencv库了,具体流程参见我的另一篇博文:一次搞定!如何用VSCode编写OpenCV

2.2
  1. 切换到…/opencv/samples/的编译输入目录(对我们来说,位于…/trunk/eclipse_build/bin),然后查看lkdemo.cpp(这是一个运动追踪的示例)。连接上一个相机,然后运行代码,它会提示选择窗口,按下r来初始化追踪。你可以通过用鼠标点击视频中的位置来添加点。也可以通过按下n来切换到只查看追踪点的模式。再次按下n会在“白天”和“夜晚”模式中切换。

该文件位于

C:\software\opencv3\opencv\sources\samples\cpp
完整路径名是
C:\software\opencv3\opencv\sources\samples\cpp\lkdemo.cpp
2.3-2.4
  1. 将示例2-11中的代码和示例2-6中的代码连接起来,建立一个读取视频并存储降采样后彩色图像的程序。
  2. 修改练习3中的程序,并结合示例2-2中窗口显示的代码来显示处理的图像。
// 读取视频文件,并将其保存为原分辨率的一半。
#include <opencv2/opencv.hpp>
#include <iostream>

int main( int argc, char** argv ){
    cv::Mat frame_bgr, frame_pry;
    cv::namedWindow( "Practice2_3", cv::WINDOW_AUTOSIZE );
    cv::namedWindow( "Pyramid_downsample", cv::WINDOW_AUTOSIZE );

    cv::VideoCapture capture;
    if( argc == 3 ){
        capture.open( argv[1] );
    }
    else{
        capture.open( 0 );
    }
    double fps = capture.get( cv::CAP_PROP_FPS );
    if( fps == 0 ){
        fps = 24;
    }
    cv::Size size(
        (int)capture.get( cv::CAP_PROP_FRAME_WIDTH ) / 2,
        (int)capture.get( cv::CAP_PROP_FRAME_HEIGHT) / 2
    );

    cv::VideoWriter writer;
    if( argc == 1 ){
        writer.open( "output_downsample.mp4", CV_FOURCC('M', 'J', 'P', 'G'), fps, size);
    }
    else{
        writer.open( argv[argc-1], CV_FOURCC('M', 'J', 'P', 'G'), fps, size );
    }

    for(;;){
        capture >> frame_bgr;
        if( frame_bgr.empty() ) break; // end if done
        cv::imshow( "Practice2_3", frame_bgr);
        cv::pyrDown( frame_bgr, frame_pry );
        cv::imshow( "Pyramid_downsample", frame_pry );
        writer << frame_pry;
        char c = cv::waitKey(10);
        if( c == 27 ) break; // allow the user to break out when type Esc
    }
    capture.release();
    return 0;
    
}
2.5

修改练习4中的代码,添加一个示例2-4中的滑动条,这样一来,用户可以动态控制金字塔的降采样等级(从2到8)。可以跳过存储的步骤,但要将处理结果显示出来。

目前下面的代码还存在一个问题,在图像缩小之后希望进度条也同比例缩小,但是现在进度条还是原来的长度。等到未来进一步学习进度条设置的问题之后,再来解决。

// 根据拖动进度条的程度,设置视频的缩小比例。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

cv::Mat g_frame_bgr, g_frame_pyr;
cv::VideoCapture g_cap;
int g_slider_position = 1;
void onTrackbarSlide( int pos, void * ){
    // Do nothing.
}

int main( int argc, char** argv ){
    cv::namedWindow( "Practice2_5", cv::WINDOW_AUTOSIZE ) ;
    int tempw = (int) g_cap.get(cv::CAP_PROP_FRAME_WIDTH);
    int temph = (int) g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);
    if( argc == 1 ){
        g_cap.open( 0 );
    }
    else{
        g_cap.open( string(argv[1]) );
    }
    cv::createTrackbar( "Level", "Practice2_5", &g_slider_position, 4, NULL);
    for(;;){
        g_cap >> g_frame_bgr;
        if( g_frame_bgr.empty() ) break;
        if(g_slider_position > 1){
            int grade = g_slider_position;
            cv::pyrDown(g_frame_bgr, g_frame_pyr);
            for(int i = 0; i < grade - 2; i++){
                cv::pyrDown( g_frame_pyr, g_frame_pyr );
            }
        }
        else{
            g_frame_pyr = g_frame_bgr;
        }
        cv::imshow( "Practice2_5", g_frame_pyr );
        char c;
        if( argc == 1){
            c = (char) cv::waitKey(10);
        }
        else{
            c = (char) cv::waitKey(100);
        }
        if( c == 27 ){
            break;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProfSnail

谢谢老哥嗷

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值