声明:这是我第一次写博客,不太懂规矩。主要目的是为了分享经验。若发现侵权,请联系我删除相应的内容。

声明:这是我第一次写博客,不太懂规矩。主要目的是为了分享经验。若发现侵权,请联系我删除相应的内容。


本文章还有部分内容跟人脸识别有关。

一、上位机程序调试遇到的错误

1.
undefined reference to `cvCreateImage'
添加静态库路径:依次点击project->bulid options->Linker setting,在该标签页中点击Add按钮添加静态库路径。


2.
haarcascade_frontalface_alt2.xml目录
D:\项目\Linux\Energy\lib\opencv\build\share\OpenCV\haarcascades
D:\项目\Linux\Energy\lib\opencv\sources\data\haarcascades_GPU
D:\项目\Linux\Energy\lib\opencv\sources\data\haarcascades


报错情况:OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in cvRead。
我发现 “\opencv\sources\data”有两个文件夹 “haarcascades_GPU”和 “haarcascades”,我们都默认用“haarcascades”下的 haarcascade_frontalface_alt 分类器。在“haarcascades_GPU”也有 haarcascade_frontalface_alt 分类器。更换另一个目录下的分类器后不再报错。

我不确定能通用,但我的问题解决了,希望能有所帮助。参考


3.capture = cvCreateCameraCapture(0);   //本来参数是是-1.

4.jpg图片转化为pgm图片   网上有专用的matlab程序(建议不要用C代码)

5.略

6.train.txt的用法    

linux文件夹的写法k1/1.pgm     若想保存到jpg文件夹下,写法是jpg/test.jpg
这是windows的写法 k1\1.pgm


二、移植opencv到linux系统

下载源码,然后到linux系统,设置好交叉编译器,编译。网上有好多教程。就不说了。

1.

integer constant is too large for 'long' type"

方法:http://blog.sina.com.cn/s/blog_7e9a88f70100wme1.html

2.

home/hjh/work/energy/recognize/main.cpp:305: undefined reference to `cvAlloc'
/home/hjh/work/energy/recognize/main.cpp:306: undefined reference to `cvCreateMat'
/home/hjh/work/energy/recognize/main.cpp:316: undefined reference to `cvLoadImage'
built-in.o: In function `doPCA()':
/home/hjh/work/energy/recognize/main.cpp:254: undefined reference to `cvAlloc'
/home/hjh/work/energy/recognize/main.cpp:256: undefined reference to `cvCreateImage'
/home/hjh/work/energy/recognize/main.cpp:259: undefined reference to `cvCreateMat'
/home/hjh/work/energy/recognize/main.cpp:262: undefined reference to `cvCreateImage'
/home/hjh/work/energy/recognize/main.cpp:278: undefined reference to `cvCalcEigenObjects'
/home/hjh/work/energy/recognize/main.cpp:280: undefined reference to `cvNormalize'
built-in.o: In function `storeTrainingData()':
/home/hjh/work/energy/recognize/main.cpp:191: undefined reference to `cvOpenFileStorage'
/home/hjh/work/energy/recognize/main.cpp:194: undefined reference to `cvWriteInt'
/home/hjh/work/energy/recognize/main.cpp:195: undefined reference to `cvWriteInt'
/home/hjh/work/energy/recognize/main.cpp:196: undefined reference to `cvWrite'
/home/hjh/work/energy/recognize/main.cpp:197: undefined reference to `cvWrite'
/home/hjh/work/energy/recognize/main.cpp:198: undefined reference to `cvWrite'
/home/hjh/work/energy/recognize/main.cpp:199: undefined reference to `cvWrite'
/home/hjh/work/energy/recognize/main.cpp:204: undefined reference to `cvWrite'

/home/hjh/work/energy/recognize/main.cpp:206: undefined reference to `cvReleaseFileStorage'

这些错误都是没有添加对应的动态库。自己搜搜对应的函数在哪个库,添加进去就好。

动态库
LIBVAR   = -lmytest             指明需要链接动态库 libmytest.so

LIBPATH  = -L./dynamiclib/libs  指明 libmytest.so 的路径

三、移植到arm板上

无法调用摄像头。因为访问硬件驱动出了问题,就是opencv提供的库函数访问不了底层的视频VIDIO文件(设备驱动描述符文件)。

所以只能采取V4L2采集视频,用来替代opencv的cvCreateCameraCapture函数。

遇到的问题:

1.fb.c:24: error: expected primary-expression before '.' token
c++不允许某种写法,并且变量不能放在函数以外定义

2.OpenCV对RGB图像数据的存储顺序是BGR
depth=8,       nChannels =3   width=320, height =240

  imageSize=230400,      widthStep =960   width=960, height =240

我的LCD一个像素是16位,因此需要提取RGB并且转化


3.

图像重叠,颜色也不对
摄像头采集到的数据是320*240的应该,LCD分辨率480*272,

提取rgb出现问题=颜色不对,图像重叠=显示函数有问题


4.

segmentation fault越界的内存访问

一般都是指针操作出问题。尤其是野指针。


迟点再把源码放上来。