简单的C++图像算法web端Demo制作

做计算机视觉的同学们在把算法写好以后,往往还想弄一个在线的web端的展示页面,然而大部分同学的算法基于C++且往往采用了OpenCV、Caffe等第三方库,怎么放到在线web端展示的确是一个很麻烦的问题。这里我假设你的图像处理算法在windows或者linux平台下用C++开发,并且使用了各种C++下的第三方库,而你需要的web端展示页面只是需要用户简单的上传图片+算法处理返回结果并且支持一定的并发就可以了,如果是这样那么我有一个简单的基于php和redis(也可以不用)的方法。

首先寻找一个图片上传的jQuery的demo,在github上这个star很多的库就很不错了:https://github.com/blueimp/jQuery-File-Upload ,我们把他clone下来以后发现自带了一个默认的基于php的服务器端。为了把这个库的默认php服务器端也跑起来我们需要安装一个php环境,无论你在linux下还是windows下推荐直接下载XAMPP一键安装就ok了(XAMPP包含了apache服务器、php环境、mysql、tomcat等包,这里我们只需要用它的apache+php)。安装好XAMPP以后点开xampp-control界面,启动apache服务器,然后把jQuery-File-Upload这个repo放到XAMPP的htdocs目录下,这样你就能从localhost里访问对应jQuery-File-Upload这个目录的index.html了。把被墙掉的几个静态资源换成国内的以后可以看到这个上传界面看起来不错,你试着上传图片就可以看到图片被存储在server/php/files目录下,如果上传错误就往apache配置、文件夹权限等方向排查。

文件上传的问题解决了,现在我们按照jQuery-File-Upload的index.html的模版上改个按钮出来,然后jQuery绑定点击就ajax去请求结果(当然了传递的参数啥的自己定制,而且你得自己写几行php脚本来响应这个ajax返回处理结果)。现在最大的问题还是请求传到了php服务端,php怎么和C++的算法进行交互的问题。我们当然可以写一个C++的命令行应用,php脚本exec调用传递参数给这个C++命令行应用并且得到结果,但是C++的图像算法往往加载很耗资源+时间,这个方案也很难支持一定并发(因为每次调用完算法就退出了)。为了解决这个问题我还想过干脆找一支同时支持linux/windows的C++的http server框架算了,后来发现C++的http server框架真的很难用,很多连解析multipart的文件都做不到。我曾经还实践过把基于OpenCV的C++算法用php-cpp编译成php扩展,但是这个方式只适合linux(php-cpp对windows兼容不好)且只适合对php比较熟悉的同学,而且感觉还很麻烦。综合以后,还是决定老老实实用C++写好一个命令行的图像算法程序(这样也最简单直观),而php通过某种方式和C++的命令行进行通信。这个通信机制我觉得还是交给redis来做比较好,当然了这样又把事情搞的更复杂了。php脚本把请求放到redis的request_list中,而C++的命令行应用blocking pop盯着redis的request_list,处理完请求后把结果回写到某个约定的key上就完了。用redis的好处还是支持比较大的并发+实时,如果你的图片以url形式传过来的话某种程度上还是分布式的。当然了你觉得麻烦可以把redis丢掉,我们可以约定php在某个目录下生产txt的文件,文件中包含了请求信息,而C++的命令行应用去定期读取该目录下的txt请求文件然后把结果按约定回写,然而这个方案是在太简陋也存在实时+并发问题。

如果你选了redis的话,你需要一支C++下的redis的client,我在github上找了一支无依赖+跨平台的客户端:cpp_redis,用cmake构建好把lib加进来嗖嗖的(写过OpenCV对cmake应该很熟悉了)。一开始我消息格式用的json,后来发现C++下用json解析实在太折腾了,于是换成acm的input那种简单粗暴的约定方式。

基本上就是这样了,关于ajax去请求结果的方式,我认为还是轮询比较好,也就是说php如果发现结果还没准备好就立刻返回而不是阻塞那个地方等结果,因为php的运行方式决定了阻塞无法支持并发。

最后,说一下我为啥不用thrift的原因,最主要的原因还是thrift依赖复杂+写法没命令行应用那么直观,毕竟我们只需要完成一个demo而已。

简单的C++图像算法web端Demo制作》有6个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注