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 ); // 帧率不为零,才能正常输出视频。
浏览库的主要部分: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
使用这本书或者http://opencv.org所提供的安装、构建指令,在debug模式和release模式下编译这个库。这也许会花一些时间,但是你需要编译得到的库和dll文件。同时注意设置cmake编译位于…/opencv/samples/文件夹下的例子。
这里说的debug模式和release模式不清楚是什么意思,但是我已经成功编译出opencv库了,具体流程参见我的另一篇博文:一次搞定!如何用VSCode编写OpenCV。
- 切换到…/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-11中的代码和示例2-6中的代码连接起来,建立一个读取视频并存储降采样后彩色图像的程序。
- 修改练习3中的程序,并结合示例2-2中窗口显示的代码来显示处理的图像。
// 读取视频文件,并将其保存为原分辨率的一半。
#include
#include
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;
}
修改练习4中的代码,添加一个示例2-4中的滑动条,这样一来,用户可以动态控制金字塔的降采样等级(从2到8)。可以跳过存储的步骤,但要将处理结果显示出来。
目前下面的代码还存在一个问题,在图像缩小之后希望进度条也同比例缩小,但是现在进度条还是原来的长度。等到未来进一步学习进度条设置的问题之后,再来解决。
// 根据拖动进度条的程度,设置视频的缩小比例。
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
#include
#include
#include
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;
}
}
}