基于OpenCVSharp对视频进行帧提取
1、获取视频每一帧,并且保存在List集合(如果是比较大的视频,不建议这样处理)
/// <summary>
/// 取视频帧
/// </summary>
/// <param name="path">视频地址</param>
/// <returns></returns>
public static List<HObject> GetPicFromVideo(string path)
{
HObject HImage;
List<HObject> HImage_L = new List<HObject>();
var cap = new VideoCapture();//OpenCV视频帧捕获
Mat Image = new Mat();
if (cap.Open(path))//输入视频进行捕获
{
bool state = true;
while (state)
{
cap.Read(Image);//输出捕获帧
if (Image.Empty())
{
state = false;
cap.Dispose();
return HImage_L;
}
Mat2HObjectBpp24(Image, out HImage);
HImage_L.Add(HImage);
}
}
cap.Dispose();
return HImage_L;
}
2、对取出的视频进行格式转换(三通道转换)
public static void Mat2HObjectBpp24(Mat mat, out HObject image)
{
int ImageWidth = mat.Width;
int ImageHeight = mat.Height;
int channel = mat.Channels();
long size = ImageWidth * ImageHeight * channel;
int col_byte_num = ImageWidth * channel;
byte[] rgbValues = new byte[size];
unsafe
{
for (int i = 0; i < mat.Height; i++)
{
IntPtr c = mat.Ptr(i);
//byte* c1 = (byte*)c;
System.Runtime.InteropServices.Marshal.Copy(c, rgbValues, i * col_byte_num, col_byte_num);
}
void* p;
IntPtr ptr;
fixed (byte* pc = rgbValues)
{
p = (void*)pc;
ptr = new IntPtr(p);
}
HOperatorSet.GenImageInterleaved(out image, ptr, "bgr", ImageWidth, ImageHeight, 0, "byte", 0, 0, 0, 0, -1, 0);
}
}