Linux下opencv环境搭建,opcv2.4.9

最近做一个arm移植opencv的项目,在Linux虚拟机上搭建了opencv环境,寻找了几个教程,这个很靠谱;
OpenCV is the most popular and advanced code library for Computer Vision related applications today, spanning from many very basic tasks (capture and pre-processing of image data) to high-level algorithms (feature extraction, motion tracking, machine learning). It is free software and provides a rich API in C, C++, Java and Python. Other wrappers are available. The library itself is platform-independent and often used for real-time image processing and computer vision.

1.移除先前安装的ffmpeg和x264

sudo apt-get -qq remove ffmpeg x264 libx264-dev

2.安装依赖项

sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils ffmpeg cmake qt5-default checkinstall

3.下载并解压OpenCV

1 wget -O OpenCV-$version.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/$version/opencv-"$version".zip/download
2 unzip OpenCV-$version.zip
3 cd opencv-$version

4.编译源码,构建OpenCV

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
make -j2
sudo make install
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

5.测试OpenCV是否安装成功

自动编译opencv文件代码:

#!/bin/bash
echo "compiling $1"
if [[ $1 == *.c ]]
then
    gcc -ggdb `pkg-config --cflags opencv` -o `basename $1 .c` $1 `pkg-config --libs opencv`;
elif [[ $1 == *.cpp ]]
then
    g++ -ggdb `pkg-config --cflags opencv` -o `basename $1 .cpp` $1 `pkg-config --libs opencv`;
else
    echo "Please compile only .c or .cpp files"
fi
echo "Output file => ${1%.*}"

将此代码保存成脚本文件,在调用时把要编译的opencv文件作为参数传进去;

附上编写的一个简单的人脸检测程序;

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <iostream>
using namespace std;
using namespace cv;  
void Face_detect(Mat& img,CascadeClassifier& face_cascade,CascadeClassifier& eye_cascade,double scale);
int main(int argc,char *argv[])
{
	if(argc<2)
	{
		cout<<"please input your 'scale'\n"<<endl;
		return -1;
	}
	if(atoi(argv[1])>9)
	{
		cout<<"please input the number between 0&9\n"<<endl;
		return -1;
	}
	//定义联机分类器类;
	CascadeClassifier face_cascade,eye_cascade;
	//加载人脸检测和眼镜检测模型;
	face_cascade.load("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");
	eye_cascade.load("/usr/share/opencv/haarcascades/haarcascade_eye.xml");
	//打开摄像头
	VideoCapture cap(0);	
	if(!cap.isOpened())
	{
		return -1;
	}
	
	//定义Mat变量
	Mat frame;
	//循环进行人脸描框和显示;
	bool stop=0;
	while(!stop)
	{
		//提出图片
		cap>>frame;
		//检测
		Face_detect(frame,face_cascade,eye_cascade,atoi(argv[1]));
		//如果有按键按下,退出;
		if(waitKey(30)>=0)
			stop=1;
		//显示;
		imshow("face",frame);
	}
	return 0;  	
}
//人脸检测程序;
void Face_detect(Mat& img,CascadeClassifier& face_cascade,CascadeClassifier& eye_cascade,double scale)
{
	const static Scalar colors[] = {
    CV_RGB(0,0,255),
    CV_RGB(0,128,255),
    CV_RGB(0,255,255),
    CV_RGB(0,255,0),
    CV_RGB(255,128,0),
    CV_RGB(255,255,0),
    CV_RGB(255,0,0),
    CV_RGB(255,0,255)} ;
	int i=0;
	vector<Rect> faces;
	//初始化灰度图像和缩小图像,定义scale(缩小尺寸)
	Mat gray, smallImg(cvRound(img.rows/scale),cvRound(img.cols/scale),CV_8UC1);
	//将图像转换成灰度图像;
	cvtColor(img,gray,CV_BGR2GRAY);
	//将灰度图缩小;
	resize( gray,smallImg,smallImg.size(),0,0,INTER_LINEAR);
	//直方图均值化处理;
	equalizeHist( smallImg, smallImg );
	//检测人脸;
	face_cascade.detectMultiScale( smallImg, faces,1.1, 2, 0|CV_HAAR_SCALE_IMAGE,Size(10, 10));
	
	//将检测到的每个人脸框出来;
	//r是指向faces矩形的指针;
	for(vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++,i++)
	{
		Point vertex1,vertex2;	
		Scalar color = colors[i%8];
		Mat ImgROI;//眼睛区域;
		vector<Rect> eyes;
		
		
		//保存人脸矩形的两个顶点,等比例放大;
		vertex1.x=r->x*scale;
		vertex1.y=r->y*scale;
		
		vertex2.x=(r->x+r->width-1)*scale;
		vertex2.y=(r->y+r->height-1)*scale;
		
		rectangle(img,vertex1,vertex2,color,2);	//将人脸框出;
		
		if(eye_cascade.empty())
			continue;
		ImgROI=smallImg(*r);//*r是(缩小灰度)人脸矩形;
		//检测眼睛;
		eye_cascade.detectMultiScale(ImgROI,eyes,1.1,2,CV_HAAR_SCALE_IMAGE,Size(5,5));
		for(vector<Rect>::const_iterator er=eyes.begin();er!=eyes.end();er++)
		{
			vertex1.x=(r->x+er->x)*scale;
			vertex1.y=(r->y+er->y)*scale;
			
			vertex2.x=(r->x+er->x+er->width-1)*scale;
			vertex2.y=(r->y+er->y+er->height-1)*scale;
			rectangle(img,vertex1,vertex2,color,2);	//将眼睛框出;
		}
	}
	
}

在调用此程序时,需要传入一个参数,0-9的双数,表示用来检测的图片的缩小规格;
在调用此函数时,注意将虚拟机上摄像头打开;
虚拟机摄像头

猜你喜欢

转载自blog.csdn.net/stm32_newlearner/article/details/85127607