声明:这是我第一次写博客,不太懂规矩。主要目的是为了分享经验。若发现侵权,请联系我删除相应的内容。
声明:这是我第一次写博客,不太懂规矩。主要目的是为了分享经验。若发现侵权,请联系我删除相应的内容。
本文章还有部分内容跟人脸识别有关。
一、上位机程序调试遇到的错误
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越界的内存访问
一般都是指针操作出问题。尤其是野指针。
迟点再把源码放上来。