做项目中需要把一个彩色视频转成灰度视频用来测试,原来电脑里有一个会声会影卸掉了,于是打算用OpenCV搞个程序,网上搜了一下愣是没有找到现成的代码,要么就都是OpenCV2的,API全都不一样了(巨想吐槽OpenCV这一点,升级换代就算了,为什么要改接口名啊喂),好吧亲力亲为自己撸一个,居然花了快一个小时。
主要是因为没有注意到VideoWriter在输出单通道图像时的参数设置问题。
代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <math.h> #include "opencv2/opencv.hpp" #include<opencv2\core\core.hpp> #include<opencv2\imgproc\imgproc.hpp> #include<opencv2\highgui\highgui.hpp> #include<iostream> #include<stdio.h> #include <time.h>
using namespace std; using namespace cv;
int main(int argc, char *argv[]) {
cv::VideoCapture capture("E:\\VS2015\\myProject\\RussianEVM\\RussianEVM\\data\\face.mp4"); double rate = capture.get(CV_CAP_PROP_FPS); int w = capture.get(CV_CAP_PROP_FRAME_WIDTH); int h = capture.get(CV_CAP_PROP_FRAME_HEIGHT); bool stop(false); Mat frame; std::cout << w; std::cout << h; cv::VideoWriter w_cap("gray.avi", -1, rate, cv::Size(528, 592),0);
if (!capture.isOpened()) { std::cout << "fail to load video"; return 1; }
namedWindow("Gray Video"); int delay = 1000 / rate;
while (capture.read(frame)) { Mat result; cvtColor(frame,result,CV_BGR2GRAY); imshow("Gray Video", result); cv::resize(result, result, cv::Size(528 ,592)); w_cap.write(result); if (waitKey(delay) >= 0) break;
}
return 0; }
|