我正在尝试使用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
答案 0 :(得分:1)
某些编解码器只接受宽度(有时是高度)值,这些值是2,4,8或更多的倍数。我不知道MJPG编解码器中的这种限制,但是您描述的问题类似于在宽度不是指定值的倍数的图像上使用所述编解码器时发生的问题。你可能想看看宽度是否为16的倍数可以解决这个问题。
答案 1 :(得分:0)
我认为这可能是图像跨度/音高问题。确保支持图像,其中每行的分配字节数可能不等于单个像素大小的宽度。不幸的是我不熟悉EmguCV,但我希望它会支持它。