c#winform调用海康的SDK实现实时播放监控画面,然后设置画图回调函数,播放的时候回很卡,有没有大神给思路处理一下??????????
public void drawFunCallBack(int nPort, IntPtr hDc, IntPtr nUser)
{
imgPath = @"D:\Img\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";
HKStruct.NET_DVR_JPEGPARA lpJpegPara = new HKStruct.NET_DVR_JPEGPARA();
lpJpegPara.wPicQuality = 2; //图像质量 Image quality
lpJpegPara.wPicSize = 0xff;
if(!HKFunction.NET_DVR_CaptureJPEGPicture(userId, 1, ref lpJpegPara, imgPath))
{
iLastStr = string.Format("抓图失败,返回错误码:{0},请参照海康SDK错误码信息", iLastErr);
return;
}
#region 激活SDK
retCode = ArcSoftFunction.ASFActivation(ArcSoftConfig.appId, ArcSoftConfig.sdkKey);
#endregion
#region 初始化引擎
uint detectMode = ArcSoftConfig.ASF_DETECT_MODE_IMAGE;
int detectFaceOrientPriority = ArcSoftConfig.ASF_OP_0_ONLY;
int detectFaceScaleVal = 16;
int detectFaceMaxNum = 20;
int combinedMask = ArcSoftConfig.ASF_FACE_DETECT | ArcSoftConfig.ASF_FACERECOGNITION | ArcSoftConfig.ASF_AGE |
ArcSoftConfig.ASF_GENDER | ArcSoftConfig.ASF_FACE3DANGLE;
IntPtr hEngine = IntPtr.Zero;
retCode = ArcSoftFunction.ASFInitEngine(detectMode, detectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref hEngine);
#endregion
Image srcImage = Image.FromFile(imgPath);
ArcSoftClass.ImageInfo imageInfo = ImageUtil.ReadBMP(srcImage);
IntPtr detectedFaces = MemoryUtil.Malloc(MemoryUtil.SizeOf<ArcSoftStruct.ASF_MultiFaceInfo>());
retCode = ArcSoftFunction.ASFDetectFaces(hEngine, imageInfo.width, imageInfo.height, imageInfo.format, imageInfo.imgData, detectedFaces);
ArcSoftStruct.ASF_MultiFaceInfo multiFaceInfo = new ArcSoftStruct.ASF_MultiFaceInfo();
multiFaceInfo = MemoryUtil.PtrToStructure<ArcSoftStruct.ASF_MultiFaceInfo>(detectedFaces);
if (multiFaceInfo.faceNum > 0)
{
listRect = new List<ArcSoftStruct.MRECT>();
for (int i = 0; i < multiFaceInfo.faceNum; i++)
{
ArcSoftStruct.MRECT rect = MemoryUtil.PtrToStructure<ArcSoftStruct.MRECT>(multiFaceInfo.faceRects + MemoryUtil.SizeOf<ArcSoftStruct.MRECT>() * i);
listRect.Add(rect);
}
#region 年龄检测
retCode = ArcSoftFunction.ASFProcess(hEngine, imageInfo.width, imageInfo.height, imageInfo.format, imageInfo.imgData, detectedFaces, ArcSoftConfig.ASF_AGE);
if (retCode == 0)
{
//获取年龄信息
IntPtr pAgeInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf<ArcSoftStruct.ASF_AgeInfo>());
retCode = ArcSoftFunction.ASFGetAge(hEngine, pAgeInfo);
ArcSoftStruct.ASF_AgeInfo ageInfo = MemoryUtil.PtrToStructure<ArcSoftStruct.ASF_AgeInfo>(pAgeInfo);
if(ageInfo.num > 0)
{
listAge = new List<int>();
for (int i = 0; i < ageInfo.num; i++)
{
int age = MemoryUtil.PtrToStructure<int>(ageInfo.ageArray + MemoryUtil.SizeOf<int>() * i);
listAge.Add(age);
}
}
//释放内存
MemoryUtil.Free(pAgeInfo);
}
#endregion
#region 性别检测
//人脸信息处理
retCode = ArcSoftFunction.ASFProcess(hEngine, imageInfo.width, imageInfo.height, imageInfo.format, imageInfo.imgData, detectedFaces, ArcSoftConfig.ASF_GENDER);
if (retCode == 0)
{
//获取性别信息
IntPtr pGenderInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf<ArcSoftStruct.ASF_GenderInfo>());
retCode = ArcSoftFunction.ASFGetGender(hEngine, pGenderInfo);
ArcSoftStruct.ASF_GenderInfo genderInfo = MemoryUtil.PtrToStructure<ArcSoftStruct.ASF_GenderInfo>(pGenderInfo);
if (genderInfo.num > 0)
{
listGender = new List<int>();
for (int i = 0; i < genderInfo.num; i++)
{
int gender = MemoryUtil.PtrToStructure<int>(genderInfo.genderArray + MemoryUtil.SizeOf<int>() * i);
listGender.Add(gender);
}
}
//释放内存
MemoryUtil.Free(pGenderInfo);
}
#endregion
//释放内存
MemoryUtil.Free(detectedFaces);
}
//释放引擎
retCode = ArcSoftFunction.ASFUninitEngine(hEngine);
if (listRect != null && listRect.Count > 0)
{
float scaleRate = ImageUtil.getWidthAndHeight(srcImage.Width, srcImage.Height, liveViewPictureBox.Width, liveViewPictureBox.Height);
Graphics g = Graphics.FromHdc(hDc);
for (int i = 0; i < listRect.Count; i++)
{
#region 添加性别年龄信息
StringBuilder strAgeGender = new StringBuilder();
if (listAge != null && listAge.Count == listRect.Count)
{
strAgeGender.Append("年龄:");
strAgeGender.Append(listAge[i]);
}
if (listGender != null && listGender.Count == listRect.Count)
{
if (listGender[i] == 0)
{
strAgeGender.Append(",性别:");
strAgeGender.Append("男");
}
else if (listGender[i] == 1)
{
strAgeGender.Append(",性别:");
strAgeGender.Append("女");
}
}
#endregion
#region 添加人脸标记
int startX = (int)(listRect[i].left * scaleRate) + 10;//矩形框左上角X坐标
int startY = (int)(listRect[i].top * scaleRate) - 50;//矩形框左上角Y坐标
int width = (int)(listRect[i].right * scaleRate) - (int)(listRect[i].left * scaleRate) - 50; //矩形的宽度
int height = (int)(listRect[i].bottom * scaleRate) - (int)(listRect[i].top * scaleRate) - 50; //矩形的高度
Pen pen = new Pen(Color.Red, 1);
g.DrawRectangle(pen, new Rectangle(startX < 1 ? 0 : startX, startY < 1 ? 0 : startY, width, height));
#endregion
#region 添加年龄性别标记
Font fromat = new Font("宋体", 10);
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;//水平对其
SizeF size = g.MeasureString(strAgeGender.ToString(), fromat);
g.DrawString(strAgeGender.ToString(), fromat, Brushes.Red, startX, startY - 14);
#endregion
}
listRect.Clear();
listAge.Clear();
}
else
{
if (srcImage != null)
{
srcImage.Dispose();
}
File.Delete(imgPath);
}
}
如代码所示,调用回调函数之后,先调用海康SDK的抓图函数,获取每一帧视频数据,然后处理每一帧视频数据,包括人脸识别、性别识别、年龄识别,所以导致播放的时候视频会卡,有没有思路处理一下,让播放不卡顿。