hi3520d平台编译使用opencv3.4.1
hi3520dv300,不多介绍,坛子里资料多的是。
opencv3.4.1,opencv不多介绍,百度一下知道是什么东西,有什么用。3.4.1版本是opencv比较新的版本,做AI算法的话用新一点版本不会落后。
说实话,hi3520dv300这颗SOC性能有限,做视频的行为分析肯定很累,如果每秒抓拍一张图片,做图片分析还是能够物尽其用的。
下面说一下我移植使用的过程。
首先,opencv官网下载了源码包,为了稳当期间,在当前目录建了一个build文件夹,用cmake-gui默认参数,prefix指定这个build文件夹,其他默认编译,过几分钟很顺利就出来了,写一个简单图片的行人识别、人脸识别代码,编译通过之后,百度几张有行人的照片,在PC上的速度和效果很不错,
贴出代码:
void human(const char *fname)
{
Mat image;
bool safehead=false;
(void)safehead;
HOGDescriptor hog; // 采用默认参数
CascadeClassifier dail_cascade;
std::vector
Mat grayscaleFrame;
Mat tmpp;
String flq = "/mnt/nfs/terminal3/cascade.xml";
IplImage*img;
if(dail_cascade.load(flq))
{
safehead = true;
}
else
{
cout<<"warning : load cascade-v2.5.xml fault!"<<endl;
}
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); // 采用已经训练好的行人检测分类器
img = cvLoadImage(fname);
if (!img)
{
std::cout<<"read img failed"<<std::endl;
return;
}
image = cvarrToMat(img);
// delete img;
// 1. 定义HOG对象
// 2. 设置SVM分类器
// 3. 在测试图像上检测行人区域
resize(image, tmpp, Size(720,576));
cvtColor(tmpp, grayscaleFrame, CV_BGR2GRAY);
hog.detectMultiScale(grayscaleFrame, regions, 0, Size(8,8), Size(32,32), 1.05, 1);
// hog.detectMultiScale(grayscaleFrame, regions, 0.6, Size(4,4), Size(0,0), 1.07, 1);
// 显示
for (size_t i = 0; i < regions.size(); i++)
{
Mat tmp_roi;
size_t j;
vector
char fname[128];
Rect x,y;
int xx,yy,ww,hh;
int w_s,h_s;
xx = regions[i].x;
w_s = regions[i].width;
w_s *= 2;
w_s /= 3; // 宽度增量
h_s = regions[i].height;
h_s *= 2;
h_s /= 3; // 高度增量
// printf("w_s=%d,h_s=%d\n", w_s,h_s);
if(w_s > xx)
{
xx = 0;
}
else
{
xx -= w_s/2;
}
yy = regions[i].y;
if(h_s > yy)
{
yy = 0;
}
else
{
yy -= h_s;
}
ww = regions[i].width+w_s;
hh = regions[i].height+h_s;
if(ww+xx > tmpp.cols)
{
ww = tmpp.cols-xx;
}
if(hh+yy > tmpp.rows)
{
hh = tmpp.rows-yy;
}
x = Rect(xx, yy, ww, hh);
// x = regions[i];
tmp_roi = Mat();
tmp_roi = grayscaleFrame(x);
printf("detect %d people ...\n", (int)i+1);
dail_cascade.detectMultiScale(tmp_roi, rect_roi, 1.01, 5);
for(j=0; j<rect_roi.size(); j++)
{
if(j>50)break;
printf("find object %d ...\n", (int)j+1);
y = rect_roi[j];
rectangle(tmp_roi, rect_roi[j], Scalar(0,0,255),1);
y.x += regions[i].x;
// y.y = regions[i].y;
rectangle(tmpp, y, Scalar(0,0,255),1);
}
char fff[32];
sprintf(fff,"picture %d",(int)i+1);
putText(tmp_roi, fff, Point(0,20), FONT_HERSHEY_SIMPLEX,1.0,Scalar(0,0,255));
const char *s;
if(i==0)s="'st";
else if(i==1)s="'nd";
else if(i==2)s="'rd";
else s="'th";
printf("found %d objects in %d%s people\n", (int)j,(int)i+1, s);
sprintf(fname, "res/%d.jpg",(int)i+1);
imwrite(fname, tmp_roi);
rectangle(tmpp, regions[i], Scalar(0,255,0), 1);
}
imwrite("res/test2.png", tmpp);
}
然后PC的测试过程就顺利结束了。
然后再建一个build_arm文件夹,cmake-gui指定了交叉编译器,出现一大堆错误,主要就是链接不到dlopen、pthread_create函数之类的错误。
百度很多内容,根据内容和make文件比较,发现链接时需要链接pthread库,重新cmake-gui,增加一个entry,指定一个HAVE_PTHREAD的BOOL字段,然后打钩,错误少了很多,但是test相关的仍然报错。
百度无果,但是知道问题所在,就根据报错的文件夹,发现是在build_arm/modules/XXXX/CMakeFiles/opencv_test_XXXX.dir下的下的链接报错。XXXX指的是highgui、core、features2d、imgproc等多个文件夹。
这些文件夹和文件都是cmake-gui生成,又不知道怎么样加上链接库,就找各文件夹下面的文件名分析,发现都有一个link.txt,里面一大堆obj文件,指定生成一个可执行文件。在这个尾部加上“ -lpthread -ldl”后保存,继续再make,就编译成功了。
大约有17个这样的文件,逐个改了就行了,哪个不改,就会出错停在哪里,发现出错,改了link.txt就能通过。
make顺利通过,make install顺利通过,sample代码顺利通过,一切都正常了
- 分享
- 举报
-
浏览量:3640次2017-11-16 11:30:55
-
浏览量:3273次2018-04-12 11:32:51
-
浏览量:1268次2023-07-12 14:00:38
-
浏览量:582次2024-01-24 14:47:22
-
浏览量:843次2024-01-08 18:13:05
-
浏览量:4950次2020-08-11 17:39:02
-
浏览量:2319次2024-01-18 15:01:07
-
浏览量:2119次2019-07-20 14:05:57
-
浏览量:2845次2020-05-21 19:20:01
-
浏览量:2362次2022-01-10 09:00:16
-
2018-06-18 22:47:22
-
浏览量:6115次2017-12-12 21:37:12
-
浏览量:6528次2020-08-15 17:22:26
-
浏览量:2890次2018-04-03 09:48:45
-
浏览量:2113次2024-01-18 15:07:54
-
浏览量:5332次2019-12-28 10:33:46
-
浏览量:9460次2018-06-02 19:08:30
-
浏览量:5746次2018-04-03 09:53:34
-
浏览量:812次2024-01-24 16:33:36
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
刘兵
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明