c#winform调用海康的SDK实现实时播放监控画面,然后设置画图回调函数,播放的时候回很卡,有没有大神给思路处理一下??????????

打工都是人上人1.1 2019-04-17 11:21:17
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的抓图函数,获取每一帧视频数据,然后处理每一帧视频数据,包括人脸识别、性别识别、年龄识别,所以导致播放的时候视频会卡,有没有思路处理一下,让播放不卡顿。
...全文
2144 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 28 楼 OrdinaryCoder 的回复:
https://blog.csdn.net/wanghuiqi2008/article/details/31410509看一下这个
不需要自己去解码了,还是调用海康的SDK,然后用多线程完美解决。
fd34gs3yf 2019-04-23
  • 打赏
  • 举报
回复
说什么是有用的? 你要的是思路,给你思路了没? 你还想要什么? 还有没有别人给你什么? 不要你以为别人都是你爹,你要什么都要给你什么?说白了,你最好是想别人把源码给你 我开始说了什么骂人的话了吗?我说的是不是事实,干不了就不要干,你说我装B,我告诉你,装B还需要有绝对实力
  • 打赏
  • 举报
回复
引用 13 楼 有一种寒冷忘穿秋裤 的回复:
[quote=引用 11 楼 fd34gs3yf 的回复:] [quote=引用 8 楼 OrdinaryCoder 的回复:] 而且你你现在获得图像那块是采用抓图函数,保存到硬盘上,然后再从硬盘上读取,这本身就是一个耗时的操作,应该直接从视频流中解码,速度大概是6楼说的30帧每秒
不是的,我说的前两条,是两个方案 第一条:用海康的实时预览,海康的视频预览是有很大延迟的(1000ms左右),在我处理后延迟较小(100ms以内),这种方案是不适合图片编辑,适合用来作为一般的监控显示 第二条:自己解码图片并显示,就可以不用海康的实时预览了,我以前在I3 CPU下解码图片消耗10ms左右,也就是100FPS,每秒显示100帧图片,绝对实时[/quote] 因为我是第一次做视频图像相关的东西,自己解码有什么思路吗?或者说一些能不能调用一些框架来解?[/quote]
引用 14 楼 fd34gs3yf 的回复:
思路? 自己解码就是自己解码,还要什么思路? 说的还不明白? 做自己力所能及的事情,如果干不了就不要勉强,我说的很清楚了,如果把路已经指的这么明确你还要问,那真的不适合搞这个
看了很多帖子,发现很多这种不管你问什么的,就是上来先随便说两句,一句有用的都没有,然后你再多问一句,就是一顿乱喷, 说话很过分,表现的自己很厉害,技术牛逼,当然很多时候其实是不想和这样的人去较真的,但那是不触及底线的情况下,好像这种干不了就不要干,不要勉强自己?请问你在说什么呢?是因为你要给我发工资?还是你家住海边呢?管的那么多?麻烦要装X去其它地方,别来我的帖子。说话一点素质都没有,开口渣渣,闭口傻逼。对此,我只能感慨一句,林子大了真是什么鸟都有。最后说一句,不是全世界皆你爹,都要惯着你。
  • 打赏
  • 举报
回复
引用 18 楼 fd34gs3yf 的回复:
[quote=引用 17 楼 有一种寒冷忘穿秋裤 的回复:] [quote=引用 14 楼 fd34gs3yf 的回复:] 思路? 自己解码就是自己解码,还要什么思路? 说的还不明白? 做自己力所能及的事情,如果干不了就不要勉强,我说的很清楚了,如果把路已经指的这么明确你还要问,那真的不适合搞这个
不知道你在装什么?干不干的了,需要你来说?你给我发工资?你看下你回答的都是些什么?CSDN就是你这样人多,整天在这个帖子装一下,那个帖子装一下。以为自己很牛X,其实说的全是废话,一句有用的都没有!请你看清楚,我说的是有没有什么解码的开源框架推荐?你多牛B,一句干不了就别勉强。你没接触过的东西你不需要去学习?不需要去了解?你这种人就是活的很失败的人,整天喜欢来网上找存在感。我拜托你,CSDN本来就是个技术交流论坛。不是给你这种人找存在感,装逼的。[/quote] 你这菜比,没给你思路???都给你说了,让你自己解码 不给你具体的方案,恼羞成怒了??? 我还用给你这样的渣渣装B???我是看不起你们这些菜比 傻逼的反应还真慢,应该是搞了几天还没搞定,被羞辱的不爽了吧,CSDN本来是技术交流的论坛,不是你这种伸手党来免费要方案的,你需要去外包网站刷存在感[/quote] 我做没做出来和你有半毛钱关系么?请问,是你给我发工资么?我是让你给我代码了?还是要让你来帮我做了?我就服你这种嘴强王者,不过我不会和狗见识,难道狗咬你一口你还要咬回去吗?还有,我结不结贴又和你有关系?你家住海边?什么都要管?还是你觉得全宇宙就你最厉害?地球离开你都不转了,宇宙离开你都要爆炸了。
OrdinaryCoder 2019-04-23
  • 打赏
  • 举报
回复
https://blog.csdn.net/wanghuiqi2008/article/details/31410509看一下这个
fd34gs3yf 2019-04-23
  • 打赏
  • 举报
回复
不要自取其辱,赶紧结贴吧
  • 打赏
  • 举报
回复
引用 25 楼 xyk21 的回复:
有没有注意过码率,我不是搞开发的,但是我们用视频监控的软件在看视频的时候发现,码率高就会卡,降得越低越流畅
不过现在我暂时已经解决这个问题了,只是我用的方式治标不治本,还在想办法从源头上来解决。
  • 打赏
  • 举报
回复
引用 25 楼 xyk21 的回复:
有没有注意过码率,我不是搞开发的,但是我们用视频监控的软件在看视频的时候发现,码率高就会卡,降得越低越流畅
不是码率的问题,因为我是调海康SDK实现预览的,然后预览之前我会去处理每一帧图像,也就是每一帧图像都会去调一个年龄、人脸、性别算法的SDK,然后这几个SDK都是C++写的,导致卡的原因就是因为这个处理过程。
伽楠 2019-04-23
  • 打赏
  • 举报
回复
有没有注意过码率,我不是搞开发的,但是我们用视频监控的软件在看视频的时候发现,码率高就会卡,降得越低越流畅
fd34gs3yf 2019-04-23
  • 打赏
  • 举报
回复
我给了你思路,随便告诉你干不了不要勉强,干折行要有点解决问题的能力,换来的竟然是你疯狂的撕咬!!!!!!!!!!!!!!!
fd34gs3yf 2019-04-23
  • 打赏
  • 举报
回复
引用 20 楼 有一种寒冷忘穿秋裤 的回复:
[quote=引用 18 楼 fd34gs3yf 的回复:] [quote=引用 17 楼 有一种寒冷忘穿秋裤 的回复:] [quote=引用 14 楼 fd34gs3yf 的回复:] 思路? 自己解码就是自己解码,还要什么思路? 说的还不明白? 做自己力所能及的事情,如果干不了就不要勉强,我说的很清楚了,如果把路已经指的这么明确你还要问,那真的不适合搞这个
不知道你在装什么?干不干的了,需要你来说?你给我发工资?你看下你回答的都是些什么?CSDN就是你这样人多,整天在这个帖子装一下,那个帖子装一下。以为自己很牛X,其实说的全是废话,一句有用的都没有!请你看清楚,我说的是有没有什么解码的开源框架推荐?你多牛B,一句干不了就别勉强。你没接触过的东西你不需要去学习?不需要去了解?你这种人就是活的很失败的人,整天喜欢来网上找存在感。我拜托你,CSDN本来就是个技术交流论坛。不是给你这种人找存在感,装逼的。[/quote] 你这菜比,没给你思路???都给你说了,让你自己解码 不给你具体的方案,恼羞成怒了??? 我还用给你这样的渣渣装B???我是看不起你们这些菜比 傻逼的反应还真慢,应该是搞了几天还没搞定,被羞辱的不爽了吧,CSDN本来是技术交流的论坛,不是你这种伸手党来免费要方案的,你需要去外包网站刷存在感[/quote] 我做没做出来和你有半毛钱关系么?请问,是你给我发工资么?我是让你给我代码了?还是要让你来帮我做了?我就服你这种嘴强王者,不过我不会和狗见识,难道狗咬你一口你还要咬回去吗?还有,我结不结贴又和你有关系?你家住海边?什么都要管?还是你觉得全宇宙就你最厉害?地球离开你都不转了,宇宙离开你都要爆炸了。[/quote] 不给你骨头,你终于是疯狂了,你给别人发工资了?
  • 打赏
  • 举报
回复
引用 14 楼 fd34gs3yf 的回复:
思路? 自己解码就是自己解码,还要什么思路? 说的还不明白? 做自己力所能及的事情,如果干不了就不要勉强,我说的很清楚了,如果把路已经指的这么明确你还要问,那真的不适合搞这个
不知道你在装什么?干不干的了,需要你来说?你给我发工资?你看下你回答的都是些什么?CSDN就是你这样人多,整天在这个帖子装一下,那个帖子装一下。以为自己很牛X,其实说的全是废话,一句有用的都没有!请你看清楚,我说的是有没有什么解码的开源框架推荐?你多牛B,一句干不了就别勉强。你没接触过的东西你不需要去学习?不需要去了解?你这种人就是活的很失败的人,整天喜欢来网上找存在感。我拜托你,CSDN本来就是个技术交流论坛。不是给你这种人找存在感,装逼的。
  • 打赏
  • 举报
回复
引用 3 楼 OrdinaryCoder 的回复:
如果要显示实时视频 那么显示就是显示 其他处理不要放在显示函数里面,如果想在实时图像中添加各种东西那么添加东西速度必须控制在一定的ms数内一般是100ms以内吧,人眼捕捉画面10帧以上应该是感觉不出卡顿的,否则就会出现卡顿
就是一个逻辑是绕不过去的,我必须处理每一帧视频数据。
  • 打赏
  • 举报
回复
引用 3 楼 OrdinaryCoder 的回复:
如果要显示实时视频 那么显示就是显示 其他处理不要放在显示函数里面,如果想在实时图像中添加各种东西那么添加东西速度必须控制在一定的ms数内一般是100ms以内吧,人眼捕捉画面10帧以上应该是感觉不出卡顿的,否则就会出现卡顿
第一个问题:我调用海康SDK的抓图函数,在画图回调函数里面调用的,所以会抓取每一帧数据,这样就会导致画面有些卡顿。 第二个问题:我会去识别这些视频帧图像,也就是对每一帧图像进行人脸、性别、年龄、等识别,调用的是C++写的相关的一些算法SDK。到这一步的时候,其实画面卡顿就已经很严重了,经常会卡个3-4秒。 第三个问题:识别完之后,根据识别结果,会在相应的视频帧数据上添加相关的文字描述,也就是俗称的画图。这一步的卡顿和上一步差不多。
OrdinaryCoder 2019-04-17
  • 打赏
  • 举报
回复
如果要显示实时视频 那么显示就是显示 其他处理不要放在显示函数里面,如果想在实时图像中添加各种东西那么添加东西速度必须控制在一定的ms数内一般是100ms以内吧,人眼捕捉画面10帧以上应该是感觉不出卡顿的,否则就会出现卡顿
OrdinaryCoder 2019-04-17
  • 打赏
  • 举报
回复
你是采用抓图 保存到本地 然后读进来 噼里啪啦一顿对这个图像进行操作再显示,海康有预览接口 直接调用预览接口就可以显示实时视频,或者 将其他操作提出来 和显示分离
  • 打赏
  • 举报
回复
其实问题主要就是在于手动处理每一帧视频数据,所以导致播放很卡,有没有什么解决思路?
fd34gs3yf 2019-04-17
  • 打赏
  • 举报
回复
搞这行的,要有点解决问题的能力
fd34gs3yf 2019-04-17
  • 打赏
  • 举报
回复
不要说第一次不第一次的,客户不会因为你第一次搞这个不给你钱,你不会是你自己的事情
fd34gs3yf 2019-04-17
  • 打赏
  • 举报
回复
思路? 自己解码就是自己解码,还要什么思路? 说的还不明白? 做自己力所能及的事情,如果干不了就不要勉强,我说的很清楚了,如果把路已经指的这么明确你还要问,那真的不适合搞这个
加载更多回复(8)

110,556

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧