C++ OpenCV C++;-无法打开使用VideoWriter保存的视频
所以我试图编辑输入视频中的所有帧,然后将它们保存到输出。保存的视频会出现,并且具有适当的文件大小,但无法打开,而while中的imshow根本不显示帧(只有一个空白窗口)。我尝试过许多编解码器(H264、MJPG、MPEG、MPV4、XVID、CVID),但没有一个能让它工作。有什么问题吗?此外,第一个函数用于将RGB转换为YUV并返回灰色通道,而第二个函数用于HPF和LPF。这些函数适用于单个图像,因此我认为它们不是问题所在C++ OpenCV C++;-无法打开使用VideoWriter保存的视频,c++,opencv,computer-vision,C++,Opencv,Computer Vision,所以我试图编辑输入视频中的所有帧,然后将它们保存到输出。保存的视频会出现,并且具有适当的文件大小,但无法打开,而while中的imshow根本不显示帧(只有一个空白窗口)。我尝试过许多编解码器(H264、MJPG、MPEG、MPV4、XVID、CVID),但没有一个能让它工作。有什么问题吗?此外,第一个函数用于将RGB转换为YUV并返回灰色通道,而第二个函数用于HPF和LPF。这些函数适用于单个图像,因此我认为它们不是问题所在 #include <opencv2\opencv.hpp>
#include <opencv2\opencv.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
Mat KonverzijaRGB2YUV(Mat ulazniFrejm){
int width = ulazniFrejm.cols;
int height = ulazniFrejm.rows;
Mat konvertovan(height, width, CV_8UC3, Scalar(0,0,0));
for(int i=0; i<width; i++){
for(int j=0; j<height; j++){
double R = ulazniFrejm.at<Vec3b>(j,i).val[0];
double G = ulazniFrejm.at<Vec3b>(j,i).val[1];
double B = ulazniFrejm.at<Vec3b>(j,i).val[2];
double Y = 0.299*R + 0.587*G + 0.114*B;
double U = 0.436*(B-Y) / (1-0.114);
double V = 0.615*(R-Y) / (1-0.299);
konvertovan.at<Vec3b>(j,i).val[0] = Y;
konvertovan.at<Vec3b>(j,i).val[1] = U;
konvertovan.at<Vec3b>(j,i).val[2] = V;
}
}
Mat Ykanal[3];
split (konvertovan, Ykanal);
Mat YkanalRGB;
cvtColor(Ykanal[0], YkanalRGB, CV_GRAY2RGB);
return YkanalRGB;
}
Mat Izostravanje(Mat ulazniFrejm){
Mat izostrena;
float valLaplas[] =
{ 0.,-1.,0.,
-1.,4.,-1.,
0.,-1.,0. };
Mat kernelLaplas(Size(3,3), CV_32FC1, valLaplas);
Mat Laplas;
filter2D(ulazniFrejm, Laplas, -1, kernelLaplas);
convertScaleAbs(Laplas, Laplas);
Mat Gaus;
GaussianBlur(ulazniFrejm, Gaus, Size(3,3), 0, 0);
addWeighted(Laplas, 1.4, Gaus, 1.0, 0, izostrena);
return izostrena;
}
int main(int argc, char** argv){
VideoCapture ulazniVideo("esmeralda.mp4");
int brojFrejmova = static_cast<int>(ulazniVideo.get(CV_CAP_PROP_FRAME_COUNT));
if(!ulazniVideo.isOpened()){
cout << "Video se ne moze otvoriti" << endl;
}
waitKey(1000);
Size frameSize = Size((int)ulazniVideo.get(CV_CAP_PROP_FRAME_WIDTH), (int)ulazniVideo.get(CV_CAP_PROP_FRAME_HEIGHT));
int fps = ulazniVideo.get(CV_CAP_PROP_FPS);
int ex = -1;
VideoWriter izlazniVideo;
izlazniVideo.open("esmeralda.mp4", ex, fps, frameSize, true);
int brojac = 0;
while(true){
Mat frame;
ulazniVideo >> frame;
Mat konvertovanFrejm;
konvertovanFrejm = KonverzijaRGB2YUV(frame);
Mat izostrenFrejm;
izostrenFrejm = Izostravanje(konvertovanFrejm);
if(frame.empty()){
break;
}
izlazniVideo << frame;
brojac++;
namedWindow("Video", CV_WINDOW_AUTOSIZE);
imshow("Video", izostrenFrejm);
int waitKey(1000/fps);
}
waitKey(0);
return 0;
}
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
Mat KonverzijaRGB2YUV(Mat ulazniFrejm){
int width=ulazniFrejm.cols;
int height=ulazniFrejm.rows;
Mat konvertovan(高度、宽度、CV_8UC3、标量(0,0,0));
对于(int i=0;i这是您的VideoWriter::release
调用?请遵循文档和教程。您需要一种方法以干净的方式关闭录制并调用releasemethod@Micka我真是太愚蠢了,忘记了发布调用,但它仍然无法工作。int waitKey(1000/fps);
--这不是调用waitKey
,它定义了一个该名称的整数变量。因为这意味着您永远不会在循环中调用waitKey
,而且这会运行消息循环,所以GUI中的任何东西都不起作用。