DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 9
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 9:13:12
标题:
32位和64位调用c++的DLL,以及图片相关的问题 浏览:3284
加入我的收藏
楼主: 最近利用某某公司的sdk开发人脸识别项目,遇到一奇葩问题:
首先是从视频流抽帧,做人脸检测并提取特征,32位下一切正常,切换成64位会出现很频繁的内错错误,也就是某些图片处理不了。
奇怪的是相同的图片,c++调用相同的dll没问题,以为是图片处理过程中出现的差异,然后我将c++处理图片的过程也封装成dll,结果依然。
传递给dll的图像参数是处理好的内错地址,请教熟悉32-64位的技术大牛
var
p:pbyte;
begin
  p:=getmem(p,size);
  ..........
end;
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 9:15:50
1楼: 以为是图片的问题,用了GDI+将图片又转换了一次,结果还是有报错的帧。
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2018/5/15 9:22:23
2楼: C++函数声明也要给一下啊,让大家竞猜吗
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 11:03:46
3楼: @武稀松 感谢指正,下面是函数声明,AFR_FSDK_ExtractFRFeature是特征提取函数
MHandle = Pointer;
MInt32 = Integer;
AFR_FSDK_OrientCode = MInt32;
 
  __tag_ASVL_OFFSCREEN = record
    u32PixelArrayFormat: MUInt32;
    i32Width: MInt32;
    i32Height: MInt32;
    ppu8Plane: array [0 .. 3] of PByte;// * ppu8Plane[4];
    pi32Pitch: array [0 .. 3] of MInt32;
  end;
 asvloffscreen = __tag_ASVL_OFFSCREEN;
{$EXTERNALSYM ASVLOFFSCREEN}
  LPASVLOFFSCREEN = ^__tag_ASVL_OFFSCREEN;
{$EXTERNALSYM LPASVLOFFSCREEN}

  AFR_FSDK_FACEINPUT = record
    rcFace: MRECT; //The bounding box of face
    lOrient: AFR_FSDK_OrientCode; //The orientation of face
  end;
  LPAFR_FSDK_FACEINPUT = ^AFR_FSDK_FACEINPUT;

function AFR_FSDK_ExtractFRFeature(
  hEngine: MHandle; //[in]  The face recognition engine
  pInputImage: LPASVLOFFSCREEN; //[in]  The input face images used to enroll
  pFaceRes: LPAFR_FSDK_FACEINPUT; //[in]  The faces'position and orientation
  //[out] The face feature information:
   FaceModels: LPAFR_FSDK_FACEMODEL): MRESULT; Cdecl;
  external ArcRecognitionDll;
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/15 11:04:37
3楼: 竞猜就算了,还没奖品。
楼主应该吧 SDK 和你写的 DEMO 一起发出来。
我们给你运行看看。找出代码错误。
否则的话,有奖竞猜,我们都懒得参加。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2018/5/15 11:58:11
4楼: 兰州你只贴你自己的代码有啥用?
sdk的定义呢?

另外,初步猜测,如果c那边用的是int32的话,那你这边的问题就出在integer那里
----------------------------------------------
--
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 12:47:17
5楼: 上面贴的就是sdk的定义啊
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 12:50:04
6楼: typedef signed    int      MInt32;
typedef unsigned  int      MUInt32;

c++用的是int
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 13:03:29
4楼: 附件是报错详情,相同的sdk,相同的图片,32位一切正常,64位有的图片可以有的图片报错,报错内容一样。
此帖子包含附件:
PNG 图像
大小:21.5K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/15 13:07:02
7楼: 多半是不乐意提供 DEMO 代码了。
无所谓。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 13:24:33
8楼: 代码我很乐意提供的。。。,只是动态库文件体积很大,这里存不下
稍后我放到网盘一份。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2018/5/15 14:37:51
9楼: 兰州不是说sdk是c++的么?
怎么贴出来成了pascal的了?

如果是兰州自己翻译的,兰州自己都说了有问题,那你还贴这个有问题的代码出来能看出什么?

再有就是,贴的异常的图,这个是浮点运算的异常。具体看你编译器的版本。

具体有可能出现的问题:
一:使用了com组件但是没有初始化com组件库。
二:浮点数溢出了。
三:如果调用了opengl和directshow库,需要考虑是否是这两个库存在冲突问题。我记忆中好像从2009~xe3都存在问题。


对于问题一,自己去初始化com组件库。
问题二:检查自己的代码
问题三:考虑更换编译器版本。或者直接禁用浮点异常:

nSaved8087CW := Default8087CW; /// 保存原设置
Set8087CW($133f); /// 禁用所有fpu异常
... /// 自己的业务代码
Set8087CW(nSaved8087CW); /// 回复设置
----------------------------------------------
--
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 15:11:31
10楼: 链接:https://pan.baidu.com/s/16h6teBkjGQCh3Q2fQ9gOGQ 
密码:b02f
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 15:19:16
11楼: demo已经上传到网盘了,附带了delphi10.2的demo以及c++2013的demo
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 15:29:10
12楼: to bahamut8348:
 禁用浮点异常尝试了,结果还是会报错。
----------------------------------------------
-
作者:
男 err0rc0de (code) ▲▲▲▲△ -
普通会员
2018/5/15 16:12:06
13楼: 上面是说发C++声明和调用,不是你翻译过的D声明和调用,当然都发出来两两比较更容易查错

然后发了个300多M的网盘,偶表示不想下载。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/15 16:13:56
14楼: 明天就下载完,后天告诉楼主解决办法,如果有的话。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 www12345 (风云) ★☆☆☆☆ -
盒子活跃会员
2018/5/15 17:22:43
15楼: 个人更倾向于,厂家的64位DLL有问题
----------------------------------------------
一卡通专家的中专家www.cnduh.com
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 17:44:22
16楼: to err0rc0de:文件确实比较大,附带了两种语言的32和64位环境
to www12345:厂家的64位C++DEMO没问题
to wang_80919:万分感谢,期待解决方法
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/15 18:10:54
15楼: 楼主 C++ 的 DEMO 我完全不懂。
请 写一个 调用过程和 DELPHI 一模一样的的 C++ DEMO。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 18:13:05
17楼: to wang_80919:有这个必要么,如果有vs2013的话可以直接编译。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/15 18:51:22
18楼: 你 界面都 不一样。
有什么好对比的。

你觉得,我会用 垃圾 VS 吗?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/15 20:18:01
19楼: to wang_80919:你都不用它,还让我弄个一样的demo,555
拜托抽空看下吧,我上传了c++的代码,只是方便对c++熟悉的人对比调试,其实只用delphi也可以看出效果,因为32位是非常非常正常的。
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2018/5/15 22:25:36
20楼: 看函数原型,好像是虹软的吧?
dll函数本身没有问题,只是虹软封装的有些奇葩,理解起来有些费劲。
多看看VC的DEMO,理解理解。
DELPHI调用的确有些陷阱,多看看文档和VC、C#的DEMO
(其实也没啥文档,多到论坛看看)。
以前折腾过,现在也记不清楚了。
----------------------------------------------
武汉天气不好
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2018/5/15 23:00:17
21楼: 国内厂商封装的SDK,海康是做的最好的。(海康的人脸识别不单独卖,集成在硬件里面了)
你想到的问题,它都想到了。DEMO、文档一应俱全。
看看DEMO,文档,一两个小时就能上手。
所以海康现在是牛叉的上市公司。
看看虹软的SDK,就知道差了人家一大截。
它也只有免费才有人用,否则谁用它呀。
原来我们公司也打算用它,后来发现很多问题,就放弃了。
推荐楼主购买商业版本。免费版本基本上都达不到实际应用要求。

云从科技的人脸识别,32位、64位CPU、GPU版本都有。离线、在线的都有。
但云从科技对使用的场合有严格的限制。比如飞机场、高铁是不让用的。
测试下来,还是有些问题。譬如用A相机拍摄,B相机进行比对。识别率就差了。
而且对光线也有点敏感。

上海依图的人脸识别也不错。也可以考虑。
但我们公司和他们有竞争关系,所以没有拿到SDK,没有测试过。据说很好。

后来我们公司购买了一家美国公司的人脸识别SDK,效果相当的好。
人脸识别、人脸比对都是在毫秒级的。
对光线明亮、黑暗、抬头、低头、侧脸、不同的相机拍摄的人脸,识别都很好。
公司网址我现在忘记了。


以上供楼主参考。
----------------------------------------------
武汉天气不好
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2018/5/16 8:45:51
22楼: 300多M,不装客户端还不让下。
算了。兰州自己研究吧
----------------------------------------------
--
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/16 8:55:50
23楼: to dbyoung:感谢您提供的参考,一看就是前辈,很有借鉴意义,确实用hr的sdk还要自己解决模糊、侧脸等一系列问题;并且官方反应超级慢。

to bahamut8348:心领了。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/16 11:11:18
24楼: 我只能说,这是 DLL 硬给你的错误。
DELPHI 是无辜的。
DELPHI 默认会提示所有的 Float 错误。
也许 VS 不提示,你也就不知道他发生错误了。
如果你乐意,可以让 DELPHI 也不提示。
//提取人脸特征
  OldAEMask := GetExceptionMask;
  try
    AEMask := OldAEMask;
    Exclude(AEMask, exInvalidOp);
    SetExceptionMask(AEMask);
    Result := AFR_FSDK_ExtractFRFeature(FFaceRecognitionEngine, @AFaceInput,
      @AFaceRegion, @tmpFaceModels) = MOK;
  finally
    SetExceptionMask(OldAEMask);
  end;
----------------------------------------------
(C)(P)Flying Wang
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2018/5/16 12:24:20
25楼: 友情提示,D群里有人开源一个:
https://github.com/yhdgs/ArcFaceSDK_Delphi.git

也许有不一样的惊喜。

开工之前,先看看,免的多走弯路
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/16 13:56:35
26楼: to wang_80919:
按你提供的方案试过了,一样会报错。
此帖子包含附件:
PNG 图像
大小:11.1K
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/16 14:06:59
27楼: crystalmoon: demo中提供的函数声明就是来源于此。
----------------------------------------------
-
作者:
男 looper (keyo) ★☆☆☆☆ -
盒子活跃会员
2018/5/16 14:35:51
26楼: @crystalmoon (黑夜杀手): 感谢分享, 正在学习ZS
----------------------------------------------
虽千万人吾往矣!
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/16 14:39:21
28楼: 我用我修改的,编译了一个,你们看看。
他的确不出错了。
Win64 仅仅是修改了图中的错误 ArcBmpTest.zip
此帖子包含附件:wang_80919_201851614394.zip 大小:3.69M
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/16 14:39:24
28楼: to dbyoung:复盘了一下,突然对你提到的那家美国公司非常感兴趣,如果可以希望能提供些资料,比如公司名网址之类的。
因为现在用虹软的sdk,确实遇到写障碍需要自己处理,比如缺少比较核心的人脸图片质量检测等等,官方答复是需要根据自己的业务,可以通过opencv等开源算法做处理,但是我觉得既然我们选择了用sdk,再去触碰底层的一些算法本身就脱离了初衷,我们还是希望能尽快将技术落地到实际业务场景,并不想在底层算法上投入更多精力,毕竟专业的事情交给专业的公司是最合理的资源分配方式。
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/16 14:50:07
29楼: to wang_80919: 
确实脱离IDE直接运行不报错了,但是并没有提取出预期结果,
目前看也仅仅是屏蔽掉了错误。
对比一下32位程序,是可以提取出7个有效特征,64位这样修改虽然不报错了但是只能提取出5个有效特征,有两个人脸的提取报错且被忽略掉了。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/16 15:19:26
30楼: 我的 EXE 的 KEY 居然不支持你的 DLL。
所以不报错了,根本就没执行。

目前的错误,只能是 DLL 产生的。

而且,只有特殊的内容发生错误。
说明不是你代码的错误,也不是函数定义翻译的问题。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/16 15:26:50
31楼: to wang_80919:
c++的64位demo,相同的图片人家就不报错,按道理说还是和delphi有关系。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/16 15:43:43
32楼: 他只是把错误给你忽略了。
或者说。和我的一样,根本就没执行。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/16 17:33:36
33楼: 我暴力修改了。
先试试 已编译的。
现在 32 和 64 都是得到 6个 信息了。

首先, github 上的有错误。
readbmp 根本就读取失败了。

修复了 readbmp之后, 错误提示一模一样的,毫无区别。
此帖子包含附件:wang_80919_2018516173333.zip 大小:3.69M
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/16 20:14:17
34楼: 经过这么久的研究,分析,可能区别在 readbmp 函数上。
也许 VS 的这个地方,读取的内容比较正规,DELPHI 版本的代码,可能写的有 BUG。

另外,to dbyoung:同求 外国高端产品的名字。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2018/5/17 8:32:15
35楼: 有段时间了,我来找找看
(虹软的DLL是没有问题的,是DELPHI调用的问题)
----------------------------------------------
武汉天气不好
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2018/5/17 15:39:47
36楼: 不好意思,找不到了。


调试了楼主的代码,BUG 在 ArcFaceSDK.pas 中 TArcFaceSDK.ReadBmp 函数
   for i:=0 to AImgDataInfo.Height -1 do
     begin
       CopyMemory(AImgDataInfo.pImgData+ i * AImgDataInfo.Width *3,
       pbyte( mem.Memory) + (AImgDataInfo.Height -1-i)* AImgDataInfo.LineBytes +54,
       AImgDataInfo.Width*3
       );
     end;

修改为:
  for I := 0 to AImgDataInfo.Height - 1 do
  begin
    CopyMemory(PByte(Int64(AImgDataInfo.pImgData) + I * AImgDataInfo.i32Width * 3), 
    PByte(Int64(mem.Memory) + (AImgDataInfo.i32Height - 1 - I) * iLineByte + 54), 
    AImgDataInfo.i32Width * 3);
  end;

就OK了,32位、64位都可以正常工作了。

原因是在64位下pbyte( mem.Memory) 越界了。
----------------------------------------------
武汉天气不好
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/17 19:53:50
37楼: 虽然楼主可以已经弃楼而逃了。
但是 非常感谢 楼上的高手。
虽然我知道,大概是这里。
但是,是在是没时间去研究,具体位置了。
而且,没想到 Memory 这个地址 不兼容 64位。学习了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/17 20:42:36
38楼: to dbyoung: 我在demo中的指定位置加了Int64(整段代码复制过去的),奇怪的是怎么还是报错呢,是AImgDataInfo的结构体不一致么,我看你写的是AImgDataInfo.i32Width和AImgDataInfo.i32Height,我的代码是AImgDataInfo.Width。不会到是不是还有其他地方有改动,恳请在指教一下。

to wang_80919:今天一个好朋友的父亲走了,去送了最后一程,楼主并没有弃楼逃跑哈。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/17 20:50:07
39楼:   for i:=0 to AImgDataInfo.Height -1 do
  begin
    CopyMemory(AImgDataInfo.pImgData + i * AImgDataInfo.Width * 3,
//    //这下面的代码 Memory 64 位 地址越界。
//    pbyte( AStream.Memory) + (AImgDataInfo.Height -1-i)* AImgDataInfo.LineBytes +54,
    PByte(Int64(AStream.Memory)) + (AImgDataInfo.Height - 1 - i) * AImgDataInfo.LineBytes + 54,
    AImgDataInfo.Width * 3);
  end;
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/17 21:01:57
40楼: to wang_80919:我也是这样改的,和之前一样呢。
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2018/5/18 8:14:52
41楼: 笔误。

我是按照SDK原有的声明,来写的测试代码。没有使用那个封装好的代码。

我测试了一下你的那个工程,的确还是报错。
原因是因为提取特征值的那行有问题。注释了就OK了。
看来这个头文件翻译的BUG一大堆。

//{$IFDEF DEBUG}
//        T := GetTickCount;
//{$ENDIF}
//        if not ExtractFaceFeatures(offInput, lFaceRegions, AFaceModels) then
//          Result := False;
//{$IFDEF DEBUG}
//        DoLog('提取特征耗时:' + IntToStr(GetTickCount - T));
//{$ENDIF}

建议楼主还是自己翻译SDK,写写测试代码,就知道SDK的运作原理了。需要注意哪些细节了。
----------------------------------------------
武汉天气不好
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/18 8:44:16
42楼: 的确还是发生了错误。
我测试的时候,没 DEBUG。所以,没看到。改不改都一样。
目前已经没有可以怀疑的对象了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2018/5/18 11:37:07
43楼: @cgzcgb 我不知道你的SDK怎么是这样子的,但我git下来的这个TArcFaceSDK.ReadBmp里的代码,不是上面的这样写的。。所以,我不知道是你下错了呢,还是我下错了。。。
下面是Git里的,可以看到,从git日志来看,从2月19日起,就是这么写了。



//读取Bitmap到到图像数据结构
class function TArcFaceSDK.ReadBmp(ABitmap: TBitmap; var AImgDataInfo:
  TImgDataInfo): Boolean;
var
  iLineByte: Integer;
  iBitCount: Integer;
  i: Integer;
  //获取位深
  function GetBitCount: Integer;
  begin
    case ABitmap.PixelFormat of
      pf1bit:
        Result := 1;
      pf4bit:
        Result := 4;
      pf8bit:
        Result := 8;
      pf15bit:
        Result := 16;
      pf16bit:
        Result := 16;
      pf24bit:
        Result := 24;
      pf32bit:
        Result := 32;
    else
      Result := 0;
    end;
  end;

begin
  Result := False;
  AImgDataInfo.Init;
  AImgDataInfo.BitCount := GetBitCount;
  if AImgDataInfo.BitCount = 0 then
    Exit;

  AImgDataInfo.Width := ABitmap.Width;
  AImgDataInfo.Height := ABitmap.Height;

  //获取位图行长度
  iLineByte := Trunc((ABitmap.Width * iBitCount / 8 + 3) / 4) * 4;
  AImgDataInfo.LineBytes := iLineByte;

  GetMem(AImgDataInfo.pImgData, iLineByte * ABitmap.Height);

  //读入内存,注意为倒序,从最后一行开始读
  for i := ABitmap.Height - 1 downto 0 do
  begin
    CopyMemory(Pointer(AImgDataInfo.pImgData + i * iLineByte),
      ABitmap.ScanLine[i],
      iLineByte);
  end;

  Result := true;
end;

另外,这个sdk是 南极土著 开源共享的,也可以在Delphi人脸识别与检测 群里和群里的高手讨论:576881745
----------------------------------------------
-
作者:
男 lzj7015 (lzj) ★☆☆☆☆ -
普通会员
2018/5/18 12:13:28
44楼: 多年前曾使用delphi开发一个小型项目,涉及二代身份证读取,使用的是成都的一家大型公司的身份证读取器及C语言编写的开发库。使用delphi调用库函数,总出现00000000地址读取错误,开发库提供商测试,也出现同样错误。将信息反馈给delphi开发商,回复为:是delphi编译器缺陷。
项目后来改用C++进行开发。这一事件以后的软件开发多使用C++进行开发。
仅供参考。
----------------------------------------------
-
作者:
男 lzj7015 (lzj) ★☆☆☆☆ -
普通会员
2018/5/18 12:20:11
45楼: delphi调用C语言编写的库函数出错并不罕见。intel mkl 新版本,delphi 调用,就会出错。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/18 12:23:59
44楼: github 上的 32 位 下不出错。64 下面一样的错误。

关键是 VS 的我懒得去建立环境,无法证明 VS 是不是不报错。
我怀疑 VS 的也报错,但是不提示而已。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2018/5/18 12:45:28
44楼: 这段代码,无非就是复制BMP的像素内存。
Delphi 对位图是进行处理过的,已经进行了翻转。
但API没有进行处理,还是倒序的。
所以这地方的循环可以用API函数来代替:
 GetBitmapBits(ABitmap.Handle, iLineByte * AImgDataInfo.Height, AImgDataInfo.pImgData);
一个API函数就可以了。
----------------------------------------------
武汉天气不好
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/18 12:56:48
46楼: //提取人脸特征
  OldAEMask := GetExceptionMask;
  try
    AEMask := OldAEMask;
    Include(AEMask, exInvalidOp);
    SetExceptionMask(AEMask);
    Result := AFR_FSDK_ExtractFRFeature(FFaceRecognitionEngine, @AFaceInput,
      @AFaceRegion, @tmpFaceModels) = MOK;
  finally
    SetExceptionMask(OldAEMask);
  end

大家看看,和 24 楼,只有 2 个字符不同。

我这回测试了,铁定能用。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 142857 (142857) ★☆☆☆☆ -
禁用账号
2018/5/18 13:46:02
47楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
发布广告,禁用帐号!
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/18 14:07:46
48楼: 你们俩懂,我们不懂。也懒得懂。
刚才的代码,证明了一件事情。 VS 的 VC 不关心 Invalid Op 。
但这真的是一个错误。一个潜在的问题。

也许楼上说的 DLL BUG 多半和这个类似。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 drroc (mvcxe) ★☆☆☆☆ -
盒子活跃会员
2018/5/18 17:38:12
49楼: 楼主如果改用D7会少很多事

到后面unicode后的delphi,调用c/c++ dll有时会很奇葩

不是说你的情况就一定是这样,我没下载你的demo和sdk,只是按经验推断,给点意见
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:https://www.mvcxe.com/
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/18 18:44:34
50楼: 楼上,你的 垃圾 D7,调用不了,现成的代码,人家用了新 版本的 语法 。例如泛型。
你用垃圾 D7,就自己重新封装吧。

更何况,你的垃圾 D7 不支持 WIN64BIT 开发。
而且 人家 问题也没出在你说的几个 弱智点 上。

46楼,就是答案 和 D7 毫无关系。

OldAEMask 在 32 和 64 下 值都是一样的。
说明 32 下的 DLL 他不发生这个错误。
64 下 DLL 发生了错误但是 VS 懒得理会。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2018/5/18 19:18:42
51楼:  dbyoung,顶了。刚去百度了 GetBitmapBits 这个函数。。。确实好用。
----------------------------------------------
-
作者:
男 bjlg (蓝天) ★☆☆☆☆ -
盒子活跃会员
2018/5/18 21:04:14
52楼: 其实可以按照vs的代码改一下,就可以啊
----------------------------------------------
http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
男 nickemma (N.E Zhou) ★☆☆☆☆ -
普通会员
2018/5/20 0:04:08
53楼: 我也是闲来无事,来倒腾一下。

根据楼上各位大神的修正及建议,终于作出跟C++一样的效果。
另外想说一下https://github.com/yhdgs/ArcFaceSDK_Delphi.git确定可以编译吗?
起码我用了楼主SDK改了非常多,然后对比了一下github上面,发现应该好多错误吧。

废话不多说,直接上图:
此帖子包含附件:
JPEG 图像
大小:252.5K
----------------------------------------------
-
作者:
男 nickemma (N.E Zhou) ★☆☆☆☆ -
普通会员
2018/5/20 0:10:36
54楼: 附个32位的EXE上来,64位平台我没有安装。

有时间的话,还可以倒腾一下用摄像头来核对人像库
此帖子包含附件:nickemma_201852001032.rar 大小:569.0K
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/20 11:06:16
55楼: to nickemma: https://github.com/yhdgs/ArcFaceSDK_Delphi.git 确实有错误,但是你不要觉得可以编译做出和c++相同效果就完美了,我遇到的问题是64位某些图片会报错。
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/20 11:12:31
56楼: to dbyoung:
  GetBitmapBits果然好用

to wang_80919:
  看来还是你说对了,确实问题解决了,大赞!
有些时候不经意的一个小地方就会冒出来一个大坑,通过这次的问题又学到了不少东西!再次感谢wang_80919。
----------------------------------------------
-
作者:
男 nickemma (N.E Zhou) ★☆☆☆☆ -
普通会员
2018/5/20 11:15:13
56楼: @cgzcgb
至于64位平台是否出错,没有测试。但是readbmp部分全改了,采用了GetBitmapBits函数方式

而且所有头文件根据官方全部重写的,ArcFaceSDK也修正好多好多。

其实可以说差不多是重写过了,您百度的源码的也只是参考而已。

起码32位上面是完美的,没有出错,没有内存泄露。
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/20 11:25:21
57楼: to nickemma:
GetBitmapBits发现有些图片ArcFaceSDK检测不到人脸,按c++提供的方式没有问题,具体原因不详。

按wang_80919提供的方法确实解决了win64位的问题,也就声明了他们的sdk对于64位确实有浮点运算异常,只不过vs给过滤掉了。
----------------------------------------------
-
作者:
男 nickemma (N.E Zhou) ★☆☆☆☆ -
普通会员
2018/5/20 12:09:38
58楼: @cgzcgb
你最好附上识别不出的图片上来。

总之我测试Delphi识别不出来的,C++也同样识别不出
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/24 13:30:12
59楼: 为啥,楼主消失了?

按此在新窗口浏览图片

因为被开除了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/29 13:29:32
60楼: @wang_80919 

哈哈,这都被你猜到啦,有人收留没
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2018/5/29 13:35:46
61楼: to nickemma:
造福一下后来人,如果可以希望能把最新的sdk声明文件共享出来

目前问题已经解决,也把浮点异常的问题反馈给了官方,但是。。他们好像动作很慢
再次感谢wang_80919以及上面的各位大咖。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/29 13:37:18
62楼: 你自己的代码,也能用了,就不需要他们的代码了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 gyh75 (ggg) ★☆☆☆☆ -
盒子活跃会员
2018/5/30 13:15:19
63楼: delphi开发的相关系统,大家可以关注下。
上位机开发之家:http://shangweiji.lofter.com
----------------------------------------------
-
作者:
男 deepfar (独孤正义) ★☆☆☆☆ -
盒子活跃会员
2018/6/6 9:50:41
64楼: 欢迎对人脸检测、识别有需要或有兴趣的同学加入 576881745 一起研究、学习、分享
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行164.0625毫秒 RSS