目标:
- 在windows、ubuntu、树莓派系统中安装opencv2.4.x 或者opencv3.4.x,
- 在windows、ubuntu、树莓派3个系统下,依次编写一个图片特性处理代码程序。(要求同时显示原始图片和特效图片,并保存特效图片到文件中。)
(一)Windows10安装opencv3.4.1
- 安装opencv3.4.1:官网下载Windows版
- 配置系统环境变量:在path中添加以下路径:“D:\mydownload\opencv341\opencv\build\x64\vc15\bin”,然后重启电脑!
(如果不添加path,运行项目时会遇见如下图情况;添加完path未重启也出现下图问题,切记重启!)
- 基于VS2017写一个opencv调用灰度图片的项目:
3.1 添加C++空项目Project1
3.2 右键添加项test1.cpp
3.3将debug调为X64,接下来都将在debug模式下进行配置
(如果没注意这一步骤,会有如下图报错:)
3.4 配置属性:(打开属性管理器:
视图=》其他窗口=》属性管理器,在右侧栏出现属性管理器界面,点开,选择Debug x64右键“属性” )
3.5添加包含目录 、库目录、附加依赖项
- 包含目录:
vc++目录=》包含目录=》选择编辑
添加解压(安装)好的OpenCV路径,分别是include,include\opencv ,include\opencv2,建议三个都添加
我的目录是(记得找到你的路径复制):
- 添加库目录
VC++目录=》库目录 解压(安装)好的OpenCV路径下
我的是(记得找到你的路径复制):
- 添加附加依赖项
链接器=》输入=》附加依赖项 手动敲入 opencv_world341d.lib
配置完成后如图:
- 编写测试程序
- 同时显示两张图片:
- 并自动保存改变灰度后的图片到项目工程文件夹中:
源码
#include <highgui.hpp>
#include <opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("d://myworkspace//VisualStudioProjects//lena.jpg");//引入图片位置
argc == 2 ? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0; i < image->height; i++)
for (int j = 0; j < image->width; j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy * dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src; Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test", 1); imshow("test", src);
cvWaitKey();
return 0;
}
(二)ubantu16.04安装opencv-3.4.1
2.1 官网下载Sources版本(下载很慢,重复下载很多次才成功,需要耐心)
2.2 将下载文件复制到home目录下,进行解压配置:
进入命令行模式:
- 解压包
unzip opencv-3.4.1.zip
- 进入到解压后的文件包中
cd opencv-3.4.1
- 安装依赖库和cmake ,如果提醒需要apt-get update,那就先sudo su进入root权限,再sudo apt-get update,然后在执行下面命令
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
- 安装完cmake之后执行命令 ,创建编译文件夹
mkdir my_build_dir
- 进入文件夹进行配置
cd my_build_dir
- cmake一下
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
- 执行命令,漫长的编译过程
sudo make
下载完成:
- 执行命令
sudo make install
- sudo make install 执行完毕后OpenCV编译过程就结束了,接下来就需要配置一些OpenCV的编译环境首先将OpenCV的库添加到路径,从而可以让系统找到
sudo gedit /etc/ld.so.conf.d/opencv.conf
执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加
/usr/local/lib
- 保存回到命令行界面
- 执行如下命令使得刚才的配置路径生效
sudo ldconfig
- 配置bash
sudo gedit /etc/bash.bashrc
在最末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
- 保存,执行如下命令使得配置生效
source /etc/bash.bashrc
- 更新
sudo updatedb
至此所有的配置都已经完成
2.3 Linux下编程:
- 在opencv-3.4.1下新建文件夹mytest
cd opencv-3.4.1
mkdir mytest
- 创建test.cpp
touch test.cpp
- 进入编程
sudo gedit /test.cpp
#sudo vim /test.cpp
#根据自己配置编辑器进行编辑
编辑下面代码:
注意补全头文件<opencv2.hightgui.cpp><opencv2/opencv.hpp>;
其中图片路径直接放在home目录下;
源码:
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("lena.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}
- 保存并编译:
gcc test.cpp -o test `pkg-config --cflags --libs opencv`
gcc编译器:gcc +文件名+ -o+输出文件流名称 +` 支持包
- 运行
./test
(三)树莓派3B+下安装opencv3.4.1(与第二步骤类似)
- 软件源更新
sudo apt-get update
- 所有软件更新
sudo apt-get upgrade
- 树莓派固件更新
sudo rpi-update
- 安装构建opencv的相关工具
sudo apt-get install build-essential cmake git pkg-config
- 安装 jpeg 格式图像工具包
sudo apt-get install libjpeg8-dev
- 安装 tif 格式图像工具包
sudo apt-get install libtiff5-dev
- 安装 jasper 图像工具包
sudo apt-get install libjasper-dev
- 安装 png 图像工具包
sudo apt-get install libpng12-dev
- 安装视频 I/O 包,最后一个4后边是字母 “L”的小写
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
- 安装gtk2.0,这一步对应前边最好用清华的源,不然下载容易出错!
sudo apt-get install libgtk2.0-dev
- 优化函数包
sudo apt-get install libatlas-base-dev gfortran
- 下载opencv源码
wget -O opencv-3.4.1.zip https://github.com/Itseez/opencv/archive/3.4.1.zip
- 解压opencv源码
unzip opencv-3.4.1.zip
- 下载opencv_contrib源码
wget -O opencv_contrib-3.4.1.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip
- 解压opencv_contrib源码
unzip opencv_contrib-3.4.1.zip
- 找到下载的文件夹,可以右键选择终端打开,也可以直接在终端下输入命令
cd opencv-3.4.1
- 新建一个名为release文件夹
mkdir release
- 进入此文件夹
cd release
- 设置cmake编译参数(仔细一点,别敲错哦~)
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.1/modules \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON ..
- 下面开始正式编译,这一步过程比较长(大概4个小时),不要动树莓派,不要断电,注意散热
sudo make
(4个小时/单线程;网上有多线程的方法安装,自行了解!不过树莓派3b+运行能力不如我们笔记本,多线程也容易崩,不推荐多线程吧~)
- 下边进行编译安装,这一步时间不算太长,耐心等待
sudo make install
- 最后更新动态链接库(第二个单词首字母是小写L)
sudo ldconfig
这里opencv就编译安装完成了!
3.3编写程序:(与linux一致要注意头文件opencv2/opencv)
3.3.1基于 C++ 编程(编写步骤与上述2.3类似)
创建opencv_test.cpp文件
编译:(lena.jpg与opencv_test.cpp处于同一目录下)
g++ opencv_test1.cpp -o opencv_test1 -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -loencv_imgcodecs
运行:
./opencv_test
3.3.2基于Python编程
- 安装python,树莓派已安装:
- 在/home/pi/opencv_test/test1_lena目录下新建lena.py
一定加上“.py”系统会默认为python文件
- 双击打开lena.py文件添加代码
源码
import cv2 as cv
import math
src=cv.imread('lena.jpg')
cv.imshow('lena', src)
scale=-3
cv.namedWindow('lena_huidu', cv.WINDOW_AUTOSIZE)
s=src.shape
for i in range(s[1]):
for j in range(s[0]):
dx=(j-s[0]/2)/(s[0]/2)
dy=(i-s[1]/2)/(s[1]/2)
weight=math.exp((dx*dx+dy*dy)*scale)
ptr = src[j,i]
ptr[0] =ptr[0]*weight
ptr[1] = ptr[1]*weight
ptr[2] = ptr[2]*weight
cv.imshow('lena_huidu', src)
cv.waitKey(0)
cv.destroyAllWindows()
- 运行
lena.jpg和lena.py文件放在同一文件夹下
大功告成!