OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 6754|回复: 7

DSP上人脸分类器的获取

[复制链接]
发表于 2009-7-14 16:36:52 | 显示全部楼层 |阅读模式
自己弄了一天,没什么头绪,提出来希望于老师和其他朋友帮帮忙。
opencv上是直接调用cvload函数载入人脸分类器,但是在emcv里面没有移植这个函数。
现在的路我觉得有2条:
一是自己载入数据,利用ccs里面的file-》data-》load载入分类器数据。
问题有:opencv是怎样使用这些数据的?源代码很简单cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0),直接返回分类器类型的指针,然后在检测函数里面使用该指针。具体xml文件里面的数据是怎么使用的,并不清楚。也就是说假如我向导入了分类器的数据,接下来再怎么通过opencv使用这些数据?希望有经验的朋友指点一下。
第二条路就是坚定不移的移植opencv - -!
这也是我目前在做的,cvload函数里面调用了不少其他的函数,那么要做的事情就是再一步步把这些函数移植过去,现在我遇到一个问题,在icvDoubleToString函数中使用了Cv64suf,而Cv64suf的定义是
typedef union Cv64suf
{
    int64 i;
    uint64 u;
    double f;
}
前两个数据结构在opencv里面的定义是:
#if defined _MSC_VER || defined __BORLANDC__
typedef __int64 int64;
typedef unsigned __int64 uint64;
#else
typedef long long int64;
typedef unsigned long long uint64;
#endif
但是ccs并没有定义long long类型,这里要自己定义或者调整数据类型,但是具体要怎么做呢?icvDoubleToString函数看不太明白。。期待高人出现指点。。

谢谢!
回复

使用道具 举报

发表于 2009-7-15 10:43:24 | 显示全部楼层

DSP上人脸分类器的获取

导入数据有二种方法,一种是用cvload ,一种是用cvloadhaarclassifiercascade, 本人感觉用cvloadhaarclassifiercascade简单一些,它在cvhaar.cpp中,移值过来非常容易,但是检测时,它的效果比cvload差一些,我也不知道是什么原因,你可以看一下从AdaBoostCARTHaarClassifier.txt到xml过程中,数据的精度发生了变化。
大家可以具体去对比一下转换前后的数据变化。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-17 16:29:27 | 显示全部楼层

DSP上人脸分类器的获取

谢谢关注!
我刚刚才把cvload函数移植过去,但是中间暂时忽略了2个问题,一个是上面提到的long long数据类型,还有一个就是CvType这个类,这个类在cvFind和cvTypeof这2个函数中有用到,但是我这里是c程序,没法使用类。现在我的做法是将这两个函数的实现为空,暂时骗过编译器,并希望它们没有被调用=。=,具体情况要在调试时跟踪,看看这两个函数到底有没有被调用。。。
另外,根据版主的意思,要使用EMCV最好是先将c程序转成c++的程序,然后再使用EMCV,但是我这边的c例程转c++时遇到两个不知道处理的错误,贴出来大家看下,看看有哪位朋友解决过这些问题没:
第一个错误: error: identifier "ACPY2_6X1X_init" is undefined。这个函数是初始化ACPY2库的,函数应该是在acpy2_64x.l64这个库中声明定义的,但是具体包含在哪个头文件中并不知道,CCS3.1路径下搜索并没有找到这个函数,而acpy2_64x.l64仅仅在cmd文件中出现一次.. -l acpy2_64x.l64。。。
第二个错误:error: a value of type &quottr" cannot be assigned to an entity of type "ScomMessage *",这一行的报错代码为:pMsgBuf = SCOM_getMsg( fromInputToProc, SYS_FOREVER );pMsgBuf是一个指针,ScomMessage *pMsgBuf;
这个错误更是不明不白, SCOM_getMsg()的定义在scom.h中。。。
我先是按照版主大人的说明准备将c例程转成c++后再使用EMCV的,无奈才疏学浅。。不得已硬着头皮在c程序里使用EMCV,移植OPENCV,于是造成开头提到的问题2.。。希望大家多多帮助
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-17 16:34:39 | 显示全部楼层

DSP上人脸分类器的获取

c转c++的第二个错误没写明白,更正一下:
Ptr SCOM_getMsg(
    SCOM_Handle  scomQueue,   /* SCOM queue from which to take a message */
    Uns          timeout      /* semaphore timeout */
    );
这个是SCOM_getMsg的声明,这个其实是一个void指针,造成这个原因应该是c++的语法检测,不能随便将一个指针转化成void指针。

经过强制转化就没问题了,另外还有一个错误。。
error: linkage specification is incompatible with previous &quotrocessInit" (declared at line 17 of "../../inc/appmain.h")
这行的代码是extern Void ProcessInit( Void ); 而appmain.h的17行是void ProcessInit();
这个错误很奇怪。。。声明了函数,在另一个文件中extern也会报错。。另外我将该行改成extern void ProcessInit(  );还是报一样的错误。。希望高手指点下。。
回复 支持 反对

使用道具 举报

发表于 2009-7-18 04:23:11 | 显示全部楼层

DSP上人脸分类器的获取

很简单,用cvload加载分类器文件,然后将cascade内容分级写入到一个文件,文件烧写到dspflash某处,然后读入即可。关键是搞清楚cascade的数据结构。至于文件如何加载到dsp有很多种方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-3 11:58:27 | 显示全部楼层

DSP上人脸分类器的获取

现在程序在cvload()里面出问题,icvXMLParseTag()和icvXMLParseValue()两个函数是相互调用的,我跟踪时发现程序一直在这2个函数里面挑来跳去,然后就不知道跳到哪去了。。。这个算不算是跑飞了呢。。不知道前面几位朋友有没有遇到过这个问题,是怎么解决的?是不是堆栈太小了?
我跟踪的方法是,函数每一次进出都在串口上打印出来,就发现程序一直进出那两个函数,自己点halt的时候就停在了一个空白出
回复 支持 反对

使用道具 举报

发表于 2009-8-3 15:09:09 | 显示全部楼层

DSP上人脸分类器的获取

现在程序在cvload()里面出问题,icvXMLParseTag()和icvXMLParseValue()两个函数是相互调用的,我跟踪时发现程序一直在这2个函数里面挑来跳去,然后就不知道跳到哪去了。。。这个算不算是跑飞了呢。。不知道前面几位朋友有没有遇到过这个问题,是怎么解决的?是不是堆栈太小了?
我跟踪的方法是,函数每一次进出都在串口上打印出来,就发现程序一直进出那两个函数,自己点halt的时候就停在了一个空白出
自己实现cvLoad吧,效率会高一些。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-3 17:38:25 | 显示全部楼层

DSP上人脸分类器的获取

谢谢关注!
我把一些没有使用到的函数删除了,现在程序没有跑飞,但是一直在那两个函数中进出。
我现在怀疑是我文件定位的问题,
cascade_name = "e:\\\\haarcascade_frontalface_alt.xml";
cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0);
这样写在PC机上是没有问题的,但是DSP上没有文件的概念,传给cvload的第一个参数应该不能被正确的解析吧,成功的前辈是怎么做的呢?能否给点提示?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-26 06:58 , Processed in 0.010407 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表