我下载的是假的SDK吗?
明智虹宇 发布于2018-12 浏览:2607 回复:6
0
收藏

今天在官网下载了最新版本的C# SDK,使用emgucv播放USB相机视频。测试结果与官方相差很大,官方是720P视频30ms,我电脑的实际结果是78ms-100ms。

这是我电脑配置:

这是源代码,请官网大神相助

BaiduApi.cs

 class BaiduApi
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(BaiduApi));

        // sdk初始化
        [DllImport("BaiduFaceApi.dll", EntryPoint = "sdk_init", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern int sdk_init(bool id_card);

        // 是否授权
        [DllImport("BaiduFaceApi.dll", EntryPoint = "is_auth", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)]
        private static extern bool is_auth();

        [DllImport("BaiduFaceApi.dll", EntryPoint = "track_by_buf", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr track_by_buf(byte[] image, int size, int max_track_num);


        internal bool isAuth()
        {
            return is_auth();
        }

        internal void sdkInit()
        {
            log.Info("开始初始化");
            int init = sdk_init(false);
            log.InfoFormat("初始化结果:{0}",init);
        }

        private Stopwatch watch = Stopwatch.StartNew();
        internal string TrackFace(byte[] bytes)
        {
            watch.Reset();
            watch.Start();
            int max_track_num = 5; // 设置最多检测人数(多人脸检测),默认为1,最多可设为10
            IntPtr ptr = track_by_buf(bytes, bytes.Length, max_track_num);
            string buf = Marshal.PtrToStringAnsi(ptr);
            log.DebugFormat("track bytes :{0}", buf);
            log.DebugFormat("耗时:{0}", watch.ElapsedMilliseconds);
            return buf;
        }
    }

 

Main.cs

public partial class Main : Form
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Main));

        private Capture capture;
        private BaiduApi baiduApi;
        private MCvFont f = new MCvFont(FONT.CV_FONT_HERSHEY_SIMPLEX, 1, 1);

        public Main()
        {
            InitializeComponent();
            baiduApi = new BaiduApi();
            capture = new Capture() {
                 FlipType = FLIP.HORIZONTAL
            };
            Application.Idle += new EventHandler(ProcessFram);
        }

        private void ProcessFram(object sender, EventArgs arg)
        {
            Image frame = capture.QueryFrame();
            if (frame != null)
            {
                string json = baiduApi.TrackFace(ImageUtil.img2byte(frame.Bitmap));
                imageBox1.Image = frame;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (!baiduApi.isAuth())
            {
                baiduApi.sdkInit();
            }
        }
    }
收藏
点赞
0
个赞
共6条回复 最后由goJhou回复于2018-12
#7goJhou回复于2018-12
#5 明智虹宇回复
其实项目现在用于闸机上的工控机为了保证散热,都是低电压的CPU J1900,内存4G,性能都很低。现在我笔记本虽然是低电压,应该也会强很多。
展开

这还是有一定配置要求的。你这个不该用离线sdk,问问工单有没有私有化部署服务提供

0
#6goJhou回复于2018-12
#4 明智虹宇回复
之所以采用 emgucv采流,是因为emgucv不仅支持文件视频,也支持rtsp,后期可以用视频文件做测试,也可以用rtsp做大屏监控。 您的意思是采流时,有可以当前帧没处理完,第二帧可能会同时来处理?
展开

你CPU运算不了1帧处理1帧,那先不说渲染UI,光处理计算都来不及

0
#5明智虹宇回复于2018-12
#2 goJhou回复
本身软件性能就跟配置有关系。依赖于机器视觉的算法需要进行计算。 你既然都贴出配置了,那肯定知道配置影响到了性能,那何必在标题里怪罪SDK呢? 开发环境和线上环境基本上做不到保持一致这道理应该了解吧。 要知道现在I9都出来了,你拿一张低电压版的I5还想要求高性能。 兄弟,我只能说 鱼和熊掌不可兼得  
展开

其实项目现在用于闸机上的工控机为了保证散热,都是低电压的CPU J1900,内存4G,性能都很低。现在我笔记本虽然是低电压,应该也会强很多。

0
#4明智虹宇回复于2018-12
#3 goJhou回复
另外,usb取流,c# 离线sdk里就自带了。 看你代码你每一帧你自己把性能损失在了emgucv的采流上,采下来的流都在进行img2byte的转换然后去跑TrackFace。 虽然不敢说sdk内部是否和你一样是这样子做,但是至少可见的代码里整个回调也没做抽帧。 只要你cpu1帧里没处理完上一帧的计算,你的这个性能只会迅速下滑,而且是累计式的。
展开

之所以采用 emgucv采流,是因为emgucv不仅支持文件视频,也支持rtsp,后期可以用视频文件做测试,也可以用rtsp做大屏监控。

您的意思是采流时,有可以当前帧没处理完,第二帧可能会同时来处理?

0
#3goJhou回复于2018-12

另外,usb取流,c# 离线sdk里就自带了。

看你代码你每一帧你自己把性能损失在了emgucv的采流上,采下来的流都在进行img2byte的转换然后去跑TrackFace。

虽然不敢说sdk内部是否和你一样是这样子做,但是至少可见的代码里整个回调也没做抽帧。

只要你cpu1帧里没处理完上一帧的计算,你的这个性能只会迅速下滑,而且是累计式的。

1
#2goJhou回复于2018-12

本身软件性能就跟配置有关系。依赖于机器视觉的算法需要进行计算。

你既然都贴出配置了,那肯定知道配置影响到了性能,那何必在标题里怪罪SDK呢?

开发环境和线上环境基本上做不到保持一致这道理应该了解吧。

要知道现在I9都出来了,你拿一张低电压版的I5还想要求高性能。

兄弟,我只能说 鱼和熊掌不可兼得

 

1
TOP
切换版块