C++ OpenCV C++;-无法打开使用VideoWriter保存的视频

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>

所以我试图编辑输入视频中的所有帧,然后将它们保存到输出。保存的视频会出现,并且具有适当的文件大小,但无法打开,而while中的imshow根本不显示帧(只有一个空白窗口)。我尝试过许多编解码器(H264、MJPG、MPEG、MPV4、XVID、CVID),但没有一个能让它工作。有什么问题吗?此外,第一个函数用于将RGB转换为YUV并返回灰色通道,而第二个函数用于HPF和LPF。这些函数适用于单个图像,因此我认为它们不是问题所在

#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中的任何东西都不起作用。