arm-linux移植opencv心历路程

标签: opencv 人脸识别 arm-linux ubuntu
47人阅读 评论(0) 收藏 举报
分类:

最近产品需要做STOP路标识别,开始了解人脸识别,OpenCV等相关技术,下面是我学习一些经历。

传统人脸识别过程:

1. 训练样本,得到haar分类器(一个.xml格式文件)

2. 将图片套入haar分类器检测


一、理论知识:

图像金字塔

https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E9%87%91%E5%AD%97%E5%A1%94

HOG特征,LBP特征和Haar-like特征

https://blog.csdn.net/q123456789098/article/details/52748918

adaboost算法原理

http://www.360doc.com/content/14/1109/12/20290918_423780183.shtml

强烈推荐下面链接的介绍

https://zhuanlan.zhihu.com/p/31427728

https://zhuanlan.zhihu.com/p/35058334

还有其他一些知识:比如机器学习,决策树,SVM,随机森林等

更高级的机器学习方法:深度学习

二、OpenCV介绍

opencv是一个计算机视觉库,详细我就不介绍了

了解点:

opencv2.x和3.x有什么区别? opencv的模块组成?

https://blog.csdn.net/zkl99999/article/details/48676487

https://docs.opencv.org/3.3.0/index.html

samples目录是一个非常重要的目录,学习opencv可以用过从samples入手。(我是从facedetect.cpp入手学习的)

三、OpenCV移植

opencv是用cmake来生成Makefile的,可以先大概了解下cmake。

arm-linux移植我参考的是下面的链接:(用cmake-gui方式)

https://blog.csdn.net/gatieme/article/details/49080355

(默认是生成动态库,如果想生成静态库,只需将BUILD_SHARED_LIBS设置为OFF)

同理在ubuntu上面移植opencv也可以用上面链接的方法,

只是cmake-gui第一步不选着Specify options for cross-compiling,而是用默认的Use default native compilers即可。


遇到的问题:

opencv程序用静态库编译不成功(动态库是可以的)

分析:静态库更其他一些库有关联,比如:图像处理库libopencv_imgproc.a依赖于libjpg,libpng等。

注意:opencv源码有一个3rdparty的目录,主要是包含第三方的库(如:jpg、png、tiff等图片的开源解码库)

解决办法:修改Makefile(确切来说是修改CMakeCache.txt),或者在cmake-gui界面配置的时候将jasper,jpeg,png,tbb,ipp,zlib等模块都配置成需要编译

arm-hisiv300-linux-g++ stopdetect.cpp -o static_stopdetect -I/opencv/output/include -L/opencv/output/lib -L/opencv/build/3rdparty/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -lpthread -lIlmImf -llibjpeg -llibpng -llibtiff -lzlib -ldl -llibjasper -llibwebp

注意:

-lIlmImf -llibjpeg -llibpng -llibtiff -lzlib -ldl -llibjasper -llibwebp这些库是有顺序要求的,可以按我这个来


如果是在ubuntu编译静态库时,ippicv下载失败

解决办法:打开build目录的CMakeDownloadLog.txt,里面有所需要的ippicv安装包官方下载路径。通过windows下载下来拷贝到源码目录的3rdparty/ippicv,并重命名为下载失败的ippicv安装包名字(一般是前面加一大串字符,类似MD5码那种

四、代码示例

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>

using namespace std;
using namespace cv;

#define CASCADE_FILE_PATH	"/mnt/stopsign_classifier.xml"


void detectAndDraw(Mat& img, CascadeClassifier& cascade)
{
    double t = 0;
	Mat gray;
    vector<Rect> stopsigns;
    const static Scalar colors[] =
    {
        Scalar(255,0,0),
        Scalar(255,128,0),
        Scalar(255,255,0),
        Scalar(0,255,0),
        Scalar(0,128,255),
        Scalar(0,255,255),
        Scalar(0,0,255),
        Scalar(255,0,255)
    };
    
    cvtColor(img, gray, COLOR_BGR2GRAY);
    equalizeHist(gray, gray);
    t = (double)getTickCount();
    cascade.detectMultiScale(gray, stopsigns, 1.1, 10) ;
    t = (double)getTickCount() - t;
	printf("detect results: time = %g ms    stopsignsNum = %d\n", t*1000/getTickFrequency(), stopsigns.size());
	for (size_t i = 0; i < stopsigns.size(); i++)
    {
        Rect r = stopsigns[i];
        Point center;
        Scalar color = colors[i%8];

        rectangle(img, cvPoint(cvRound(r.x), cvRound(r.y)),
                       cvPoint(cvRound(r.x + r.width-1), cvRound(r.y + r.height-1)),
                       color, 2);
    }
    imshow("result", img);	/* remove if run in arm-linux */
	//imwrite("/mnt/dvr_handle.jpg", img);
}


int main(int argc, const char** argv)
{
    Mat image;
    CascadeClassifier cascade;
    if(argc != 2)
    {
		printf("USAGE: \n\t./stopdetect IMAGE\n");
		return -1;
    }
 
    if(!cascade.load(CASCADE_FILE_PATH))
    {
        printf("ERROR: Could not load classifier cascade !\n");
        return -1;
    }
    image = imread(argv[1], 1);
    if(image.empty())
    {
    	printf("Could not read %s\n", argv[1]);
    	return -1;
    }
	printf("Detecting STOP sign in %s\n", argv[1]);
   	detectAndDraw(image, cascade);
	waitKey(0);     /* remove if run in arm-linux */
    
    return 0;
}

五、opencv的API和数据类型介绍

detectMultiScale函数介绍:
https://blog.csdn.net/Cooli7wa/article/details/53959195

MAT类型(矩阵,matrix的缩写)介绍 —— 图像容器

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/mat%20-%20the%20basic%20image%20container/mat%20-%20the%20basic%20image%20container.html

Scalar类型

https://blog.csdn.net/liuweiyuxiang/article/details/76929534

六、其他

如果编译的是so库,可以先给用arm-linux-strip给库“脱衣服”在放入开发板中;

同理,如果是静态库,则给生成的可执行程序strip


查看评论

个人心历路程总结

来深圳的时候,是在深圳的一家很大的软件外包公司做JAVA程序员,做一个保险业务,初出茅庐的我在那个公司加班了是三个月...
  • qq_27486535
  • qq_27486535
  • 2016-09-08 15:02:31
  • 84

关于这段时间的心历路程

在9月底火速的签完工作,然后十月也没有再去找过工作,十月看了一个月的电视剧,本想十一月开始做毕业设计的事情,到了十一月同学又来成都玩,一块去了九寨沟,陪同学玩了几天,又没了学习的心情,并且实验室的同学...
  • hanxuhai
  • hanxuhai
  • 2014-12-08 23:30:29
  • 280

Linux下安装opencv并移植至ARM

目的:OpenCV是Intel支持的开源计算机视觉库。它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。它不依赖于其它的外部库—尽管也可以使用某些外部库。OpenCV使...
  • sinat_26551021
  • sinat_26551021
  • 2016-11-24 22:25:43
  • 2601

opencv2.4.6.1+ffmpeg移植arm6410

上一次移植好的opencv没有ffmpeg,导致无法处理视频,经过几天的调试,总算弄好了。 1.检测你的opencv是否已经包含ffmpeg。这个很简单,用ldd命令查看可执行程序用了哪些动态库...
  • b5w2p0
  • b5w2p0
  • 2014-08-09 11:36:10
  • 1452

考试维护心历路程

【背景】 考试系统维护 【城市一角】 那几天的早起看到了很多也是学习了很多,早上天还没有亮起来,这个时候路上的车也很少,人也很少,我们滴滴打车,搭上车的时候在和师傅聊天的过程中,得知师傅早就接了...
  • lrtcsdn
  • lrtcsdn
  • 2018-01-29 15:34:32
  • 92

hexo+github搭建博客心历路程

前言今天突然回想起来以前在GitHub上创建的一个仓库,本来是想着以后写博客的时候都把数据同步上去,但是,今天尝试了一次,发现步骤稍显复杂, 1. 我先把项目clone到了本地 2. ...
  • wwwwwwwwwwwwdi
  • wwwwwwwwwwwwdi
  • 2017-03-09 17:23:33
  • 265

OpenCV在Ubuntu和Linux系统下的移植

1安装cmake-qt-gui:sodo apt-get install cmake-qt-gui 2. 配置cmake: 进入存放opencv2.4.10的文件夹,输入cmake-gui。进入如下界...
  • qq_31359953
  • qq_31359953
  • 2016-03-31 10:36:54
  • 943

【心励路程】----计划与执行力

凡事要有计划,不然容易乱 定好了计划,需要去执行,不然也容易乱 越乱是好的开端,解决好了,会有一些成就感 很多的时间管理工具,确实可以培养人的做事效率 每天很多...
  • u012377333
  • u012377333
  • 2017-07-27 13:43:54
  • 355

已移植到OpenCL的OpenCV功能

大家好!我借这篇文章,分享给大家今年计算机视觉领域里的一些令人兴奋不已的最新进展。特别是最新OpenCV(当前最流行的计算机视觉库)的发布,您的计算机视觉应用程序可以在现代异构计算平台上充分利用CPU...
  • lien0906
  • lien0906
  • 2015-03-10 17:41:25
  • 1298

【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】

【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4—共享库中嵌套库带路径【已解决】标签:【Linux开发】紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交叉编...
  • LG1259156776
  • LG1259156776
  • 2016-08-30 00:18:26
  • 2428
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 536
    排名: 9万+