zjkhahah / HivisionIDPhotos-cpp

HivisionIDPhotos的cpp实现手机端部署离线部署证件照程序
42 stars 9 forks source link

输入 尺寸较大(像素值)的图片无法继续处理 #6

Closed dog2code closed 1 month ago

dog2code commented 1 month ago

基于样本命令例如./HivisionIDPhotos_cpp.exe -i demo/images/test.jpg

如果demo中的test4运行后就没有输出图像。其他三个demo图片可以输出图像。

对比之下,发现test4的尺寸为1382x1884,比其他三个图片都要大,我也尝试了其他图片,1000x1500就不行。但是无法判断临界值在哪里。

猜测可能比程序中制定画板大了就不行,但显然这应该考虑在内。例如先将目标图片缩小至合适,然后进行操作,最后输出到目标尺寸。

另外,普通6英寸x4英寸是使用最多的打印大小,以300dpi为例,那打印画板大小应为1800x1200。这个尺寸应该可以自定义,而不应写入代码中,因为打印的大小和打印机有关,也可能和使用的尺寸有关。(但是如果改变了输出画板的比例,自动排版函数可能会受影响。但是3:2的比例应该没太大问题)

dog2code commented 1 month ago

顺便提一下,这个hard code进去的画板尺寸,也就是援引自python版的内容是

const int LAYOUT_WIDTH = 1746;
const int LAYOUT_HEIGHT = 1180;
zjkhahah commented 1 month ago

可能我没有解释清楚 设计之初就针对不同的人脸大小做了两个人脸检测模型如果人脸形状比较大的话建议适用8号检测模型 对应指令为 .\HivisionIDphotos.exe -i -f 8 如果图片内没有检测到人脸他也并不会生成图片

dog2code commented 1 month ago

明白。

首先是我判断错了,这个和画板大小无关。就是人脸识别函数对于整体图片尺寸的接受度。如果图片太大是不合适用来做识别的——也没必要用高清图来识别。

用不同的模型识别的确有用,不过问题是怎么算人脸比较大。。。怎么比较小。。。然后要手动去选定这个参数,这就有点违背自动化的初衷了

我测试了一下,比如把test.jpg放大到宽为1000,同样的照片,这个人脸识别程序出0个人脸;但是放大到宽800,同样的照片,就可以识别出来。

所以为了简化,在程序中先行把照片缩小(其实没必要放大,但是为了写程序简便就一律规定宽度好了)到宽为800应该可以解决大部分问题。(至于是否要输出HD版本这个可以另外修改程序)

当然如果在一张完整照片中人脸是很小的这种情况也会有,但毕竟是个例,就先不考虑了。

具体这个尺寸是多少看经验设定吧,我认为宽800可以解决大部分情况了。