Наклонное видео в openCV - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь сделать фильм с openCV.Я могу поместить все изображения в avi, и это прекрасно работает, за исключением того, что изображение наклонено под большим углом.Похоже, что он был размазан по всему изображению.

Рамки идеально квадратные, поэтому нельзя путать высоту и ширину.Изображения 24 бит.Еще одна странность в том, что она не выглядит последовательной, когда это происходит.иногда выглядит великолепно, иногда наклонно.

Вот изображение из фильма: http://dl.dropbox.com/u/63600049/MIP.avi

Вот код:

Метод PINVOKE

                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);

Версия EMGU

 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();
    }

Все изображения - 24-битные JPG одинаковых размеров

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Некоторые кодеки принимают только значения ширины (а иногда и высоты), кратные 2, 4, 8 или более. Мне не известно об этом ограничении в кодеке MJPG, но проблема, которую вы описываете, аналогична той, которая возникает, когда вы используете указанные кодеки на изображениях с шириной, не кратной указанному значению. Возможно, вы захотите посмотреть, решит ли проблему увеличение ширины, кратной 16.

0 голосов
/ 29 марта 2012

Я думаю, что это, вероятно, проблема с шагом / высотой изображения. Убедитесь, что вы поддерживаете изображения, в которых количество выделенных байтов на строку может не совпадать с шириной, умноженной на размер одного пикселя. К сожалению, я не знаком с EmguCV, но я ожидаю, что он поддержит это.

...