基于arm9的嵌入式linux V4L2+人脸检测并显示

2019-07-12 16:15发布

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

本文章还有部分内容跟人脸识别有关。一、上位机程序调试遇到的错误1.
undefined reference to `cvCreateImage'
添加静态库路径:依次点击project->bulid options->Linker setting,在该标签页中点击Add按钮添加静态库路径。


2.
haarcascade_frontalface_alt2.xml目录
D:项目LinuxEnergylibopencvuildshareOpenCVhaarcascades
D:项目LinuxEnergylibopencvsourcesdatahaarcascades_GPU
D:项目LinuxEnergylibopencvsourcesdatahaarcascades


报错情况:OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in cvRead。
我发现 “opencvsourcesdata”有两个文件夹 “haarcascades_GPU”和 “haarcascades”,我们都默认用“haarcascades”下的 haarcascade_frontalface_alt 分类器。在“haarcascades_GPU”也有 haarcascade_frontalface_alt 分类器。更换另一个目录下的分类器后不再报错。
我不确定能通用,但我的问题解决了,希望能有所帮助。参考 https://blog.csdn.net/qq_23827747/article/details/53580712
3.capture = cvCreateCameraCapture(0);   //本来参数是是-1.4.jpg图片转化为pgm图片   网上有专用的matlab程序(建议不要用C代码)5.略6.train.txt的用法    linux文件夹的写法k1/1.pgm     若想保存到jpg文件夹下,写法是jpg/test.jpg
这是windows的写法 k11.pgm

二、移植opencv到linux系统下载源码,然后到linux系统,设置好交叉编译器,编译。网上有好多教程。就不说了。1.integer constant is too large for 'long' type"方法:http://blog.sina.com.cn/s/blog_7e9a88f70100wme1.html2.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.

图像重叠,颜 {MOD}也不对
摄像头采集到的数据是320*240的应该,LCD分辨率480*272,
提取rgb出现问题=颜 {MOD}不对,图像重叠=显示函数有问题
4.segmentation fault越界的内存访问
一般都是指针操作出问题。尤其是野指针。
迟点再把源码放上来。