OpenCV无损视频保存和读取

问题描述 投票:0回答:1

我正在用EmguCV(OpenCV包装器)编写一个C#程序,我在视频中编辑像素。这些像素需要保持与我所设置的相同的值,但他们没有。例如,我设置区域100 100到105 105这些数字。83 84 65 82 84 32 76 111 114 101 109 32 105 112 115 117 109 32 100 111 108 111 114 32 115 例如,我将区域100 100设置为105 105,这些数字: START Lorem ipsum dolor s.

但当我读取这些像素时,输出的是这样的结果: 65 65 86 87 44 63 65 88 90 44 84 80 84 84 56 86 86 86 79 81 57 54 57 38 35 32 变成了胡言乱语

我需要在我的代码中修正什么才能使输出与输入相同。视频读和写。

video = new VideoCapture(op.FileName, VideoCapture.API.Ffmpeg);

noOfFrames= Convert.ToInt32(video.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount));
FPS = Convert.ToInt32(video.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps));
playing = true;
currentFrame = 0;
Mat img = new Mat();
if(encode)
{
     vw = new VideoWriter(Directory.GetCurrentDirectory() + "\\output.mp4", FPS, new System.Drawing.Size(width, height), true);
}

while (playing== true && currentFrame < noOfFrames-1)
{
    if (noOfFrames-3 == currentFrame)
    {
        //i end it a bit quicker just in case (shouldnt matter)
        vw.Dispose();
        break;
    }

    video.Read(img);
    //img.ConvertTo(img, Emgu.CV.CvEnum.DepthType.Cv32S);
    Image<Bgra, byte> frame = new Image<Bgra, byte>(img.width, img.height);
    frame = slika.ToImage<Bgra, Byte>();

    if(encode)  
    {
        //string t = "";
        for (int i = 100; i < 105; i++)
        {
            for (int j = 100; j < 105; j++)
            {
                //MessageBox.Show(sporocilo[counter]+" ");
                if(counter<msg.Length)
                {
                    frame.Data[i, j, 0] = (byte)msg[counter];
                    frame.Data[i, j, 1] = 0;
                    frame.Data[i, j, 2] = 0;
                    counter++;
                    //t += (int)frame.Data[i, j, 0] + " ";
                }
            }
            //t += "\n";
        }
        //MessageBox.Show(t);

        Mat temp = frame.Mat;
        vw.Write(frame.Mat);
    }

    else
    {
        string t="";
        for (int i = 100; i < 105; i++)
        {
            for (int j = 100; j < 105; j++)
            {
                msg2 += (char)(frame.Data[i, j, 0]+18);
                t += (int)frame.Data[i, j, 0]+" ";
            }
            t += "\n";
        }
        MessageBox.Show(t + " " + msg2);
    }

    Bitmap bmp = frame.ToBitmap();
    original.Source = Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
    currentFrame += 1;

    await Task.Delay(FPS);
}

在VideoWriter构造函数中,我缺少一个压缩参数。

vw = new VideoWriter(path, compression, FPS, size, inColor);

但是,我已经尝试了几个压缩编解码器(主要是那些有无损的写在某处的 https:/www.fourcc.org )

ASLC
CSCD
HFYU
c# opencv emgucv
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.