我正在尝试使用openCV制作电影。我可以将所有图像放入avi中,并且效果很好,除了图像倾斜 Angular 较大。看起来它已经在整个图像上被涂抹了。
框架是完美的正方形,因此不必混淆高度和宽度。图像为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、4、8或更大倍数的宽度(有时是高度)值。我没有意识到MJPG编解码器中的此限制,但是您描述的问题类似于在宽度不是指定值倍数的图像上使用所述编解码器时发生的情况。您可能想看看将宽度设为16的倍数是否可以解决问题。