Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# openCV中的倾斜视频_C#_Opencv_Emgucv - Fatal编程技术网

C# openCV中的倾斜视频

C# openCV中的倾斜视频,c#,opencv,emgucv,C#,Opencv,Emgucv,我正在尝试用openCV制作一部电影。我可以把所有的图像放进avi,它工作得很好,除了图像倾斜了一个大角度。它看起来像是被涂在了图片上 框架是完全方形的,因此不会混淆高度和宽度。图像是24位的。另一件奇怪的事情是,当它发生时,它似乎并不一致。有时它看起来很棒,有时它是倾斜的 以下是电影中的图像: 代码如下: 平沃克法 IntPtr _ptr = CvInvoke.cvCreateVideoWriter(AVIFilename, CvInvoke.CV_FOURC

我正在尝试用openCV制作一部电影。我可以把所有的图像放进avi,它工作得很好,除了图像倾斜了一个大角度。它看起来像是被涂在了图片上

框架是完全方形的,因此不会混淆高度和宽度。图像是24位的。另一件奇怪的事情是,当它发生时,它似乎并不一致。有时它看起来很棒,有时它是倾斜的

以下是电影中的图像:

代码如下:

平沃克法

                IntPtr _ptr = CvInvoke.cvCreateVideoWriter(AVIFilename, CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'), 15, size, 1);

                int count = 0;
                for (int n = 1; n < Frames.Length; n++)
                {
                    if (Frames[n].Trim().Length > 0)
                    {
                        try
                        {
                            FileInfo file = new FileInfo(Frames[n]);
                            IntPtr ptr = CvInvoke.cvLoadImage(file.FullName, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR | Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYDEPTH);
                            if (ptr == IntPtr.Zero)
                                throw new NullReferenceException(String.Format("Unable to load image from file \"{0}\".", file.FullName));

                            CvInvoke.cvWriteFrame(_ptr, ptr);
                            //VW.WriteFrame<Bgr, byte>(frame);
                            count++;
                        }
                        catch (Exception ex)
                        {
                            System.Diagnostics.Debug.Print(ex.Message);
                        }
                    }
                }
                CvInvoke.cvReleaseVideoWriter(ref _ptr);
IntPtr\u ptr=CvInvoke.cvCreateVideoWriter(avilename,CvInvoke.CV\u FOURCC('M','J','P','G'),15,大小,1);
整数计数=0;
对于(int n=1;n0)
{
尝试
{
FileInfo file=新的FileInfo(帧[n]);
IntPtr ptr=CvInvoke.cvLoadImage(file.FullName,Emgu.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR | Emgu.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYDEPTH);
如果(ptr==IntPtr.Zero)
抛出新的NullReferenceException(String.Format(“无法从文件\“{0}\”,file.FullName)加载图像));
CvInvoke.cvWriteFrame(_ptr,ptr);
//VW.WriteFrame(框架);
计数++;
}
捕获(例外情况除外)
{
系统、诊断、调试、打印(例如消息);
}
}
}
CvInvoke.cvReleaseVideoWriter(参考ptr);
埃姆古版本

 public static void CreateAVIVideoEMGU(string AVIFilename, string[] Frames)
    {
        Bitmap bitmap = new Bitmap(Frames[0]);

        VideoWriter VW = null;

        VW = new VideoWriter(AVIFilename, CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'), 15, bitmap.Height, bitmap.Width, true);

        int count = 0;
        for (int n = 1; n < Frames.Length; n++)
        {
            if (Frames[n].Trim().Length > 0)
            {
                var frame = new Emgu.CV.Image<Bgr, byte>(ConvertBitmapTo24(new Bitmap ( Frames[n])));
                VW.WriteFrame<Bgr, byte>(frame);
                count++;
            }
        }

        VW.Dispose();
    }
public static void CreateAVIVideoEMGU(字符串AVIFilename,字符串[]帧)
{
位图位图=新位图(帧[0]);
VideoWriter VW=null;
VW=新的VideoWriter(AVIFilename,CvInvoke.CV_FOURCC('M','J','P','G'),15,位图.高度,位图.宽度,true);
整数计数=0;
对于(int n=1;n0)
{
var frame=newemgu.CV.Image(ConvertBitmapTo24(新位图(帧[n]));
VW.WriteFrame(框架);
计数++;
}
}
VW.Dispose();
}

这些图像都是相同尺寸的24位jpg

我认为这可能是图像步幅/音高问题。确保支持每行分配的字节数可能不等于宽度乘以单个像素大小的图像。不幸的是,我不熟悉EmguCV,但我希望它能支持这一点。

某些编解码器只接受2、4、8或更多倍数的宽度(有时还包括高度)值。我不知道MJPG编解码器中存在此限制,但您描述的问题与在宽度不是指定值的倍数的图像上使用所述编解码器时发生的情况类似。您可能想看看将宽度设置为16的倍数是否可以解决问题。

您使用的是什么OpenCV版本,这是什么操作系统?(Win/Linux/Mac)它是EMGU 2.3 64位版本(openCV 2.0的c#包装)。我使用的是windows 7机器。你能发布“涂抹”图像的图片吗?将标记从OpenCV更改为EmguCV,并添加C#标记。我已使用CreateVideoWriter中指定的宽度进行了播放。这与视频的倾斜无关。帧被压缩了。writeframe函数似乎是关闭的。我确保了步幅和音高是正确的,我确保了包装器openCV侧的图像是正确的,我确保了整个电影中所有帧的大小都是相同的。这可能是64位的问题吗?我确保图像正确地通过包装器进入openCV(图像从openCV端正确保存,而不通过包装器)。您将获得奖励。它必须是4的倍数。谢谢我刚刚尝试了下面的代码,但出现了一个异常:captureOutput=new VideoWriter(@“test.avi”,CvInvoke.CV_FOURCC('M','J','P','G'),1,1024,1024,true);你认为原因是什么?异常:{“'对与指定绑定约束匹配的类型'Aviest.MainWindow'调用构造函数时引发异常。'行号'3'和行位置'9'。”