OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
- 安装依赖库
如果仅仅开发使用,则直接安装现成的lib即可
sudo apt-get install libopencv-dev python-opencv
编译需要的依赖库
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
libjasper-dev,如果无法安装,可以暂时先不安装
- 下载源码
eric@eric-PC:~/Documents/work/linux$ git clone https://gitee.com/mirrors/opencv.git
进入opencv目录,切换分支4.5.0
eric@eric-PC:~/Documents/work/linux/opencv$ git checkout -b 4.5.0
- 新建目录build
eric@eric-PC:~/Documents/work/linux/opencv$ mkdir build
eric@eric-PC:~/Documents/work/linux/opencv$ ls
3rdparty apps build cmake CMakeLists.txt CONTRIBUTING.md COPYRIGHT data doc include LICENSE modules platforms README.md samples SECURITY.md
- 进入build目录,配置编译参数【cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local …】
eric@eric-PC:~/Documents/work/linux/opencv/build$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
cmake: /usr/local/lib/libcurl.so.4: no version information available (required by cmake)
...
-- Other third-party libraries:
-- Intel IPP: 2020.0.0 Gold [2020.0.0]
-- at: /home/eric/Documents/work/linux/opencv/build/3rdparty/ippicv/ippicv_lnx/icv
-- Intel IPP IW: sources (2020.0.0)
-- at: /home/eric/Documents/work/linux/opencv/build/3rdparty/ippicv/ippicv_lnx/iw
-- Lapack: NO
-- Eigen: NO
-- Custom HAL: NO
-- Protobuf: build (3.5.1)
--
-- OpenCL: YES (no extra features)
-- Include path: /home/eric/Documents/work/linux/opencv/3rdparty/include/opencl/1.2
-- Link libraries: Dynamic load
--
-- Python 2:
-- Interpreter: /usr/bin/python2.7 (ver 2.7.16)
-- Libraries: /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.16)
-- numpy: /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.16.2)
-- install path: lib/python2.7/dist-packages/cv2/python-2.7
--
-- Python (for build): /usr/bin/python2.7
--
-- Java:
-- ant: NO
-- JNI: NO
-- Java wrappers: NO
-- Java tests: NO
--
-- Install to: /usr/local
-- -----------------------------------------------------------------
--
/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/eric/Documents/work/linux/opencv/build
eric@eric-PC:~/Documents/work/linux/opencv/build$
- make
eric@eric-PC:~/Documents/work/linux/opencv/build$ make
...
Scanning dependencies of target opencv_interactive-calibration
[100%] Building CXX object apps/interactive-calibration/CMakeFiles/opencv_interactive-calibration.dir/calibController.cpp.o
[100%] Building CXX object apps/interactive-calibration/CMakeFiles/opencv_interactive-calibration.dir/calibPipeline.cpp.o
[100%] Building CXX object apps/interactive-calibration/CMakeFiles/opencv_interactive-calibration.dir/frameProcessor.cpp.o
[100%] Building CXX object apps/interactive-calibration/CMakeFiles/opencv_interactive-calibration.dir/main.cpp.o
[100%] Building CXX object apps/interactive-calibration/CMakeFiles/opencv_interactive-calibration.dir/parametersController.cpp.o
[100%] Building CXX object apps/interactive-calibration/CMakeFiles/opencv_interactive-calibration.dir/rotationConverters.cpp.o
[100%] Linking CXX executable ../../bin/opencv_interactive-calibration
[100%] Built target opencv_interactive-calibration
Scanning dependencies of target opencv_version
[100%] Building CXX object apps/version/CMakeFiles/opencv_version.dir/opencv_version.cpp.o
[100%] Linking CXX executable ../../bin/opencv_version
[100%] Built target opencv_version
如果出现如下提示
cmake: /usr/local/lib/libcurl.so.4: no version information available (required by cmake)
说明libcurl.so冲突了
eric@eric-PC:/usr/local/lib$ ls *libcurl* -l
-rw-r--r-- 1 root staff 994226 8月 11 16:10 libcurl.a
-rwxr-xr-x 1 root staff 1004 8月 11 16:10 libcurl.la
lrwxrwxrwx 1 root staff 16 8月 11 16:10 libcurl.so -> libcurl.so.4.6.0
lrwxrwxrwx 1 root staff 16 8月 11 16:10 libcurl.so.4 -> libcurl.so.4.6.0
-rwxr-xr-x 1 root staff 513440 8月 11 16:10 libcurl.so.4.6.0
删除多余的libcurl.so.4,即可
eric@eric-PC:/usr/local/lib$ sudo rm libcurl.so.4
请输入密码
[sudo] eric 的密码:
验证成功
eric@eric-PC:/usr/local/lib$ ls *libcurl* -l
-rw-r--r-- 1 root staff 994226 8月 11 16:10 libcurl.a
-rwxr-xr-x 1 root staff 1004 8月 11 16:10 libcurl.la
lrwxrwxrwx 1 root staff 16 8月 11 16:10 libcurl.so -> libcurl.so.4.6.0
-rwxr-xr-x 1 root staff 513440 8月 11 16:10 libcurl.so.4.6.0
- sudo make install
eric@eric-PC:~/Documents/work/linux/opencv/build$ sudo make install
...
-- Up-to-date: /usr/local/share/opencv4/haarcascades/haarcascade_righteye_2splits.xml
-- Up-to-date: /usr/local/share/opencv4/haarcascades/haarcascade_russian_plate_number.xml
-- Up-to-date: /usr/local/share/opencv4/haarcascades/haarcascade_smile.xml
-- Up-to-date: /usr/local/share/opencv4/haarcascades/haarcascade_upperbody.xml
-- Up-to-date: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalcatface.xml
-- Up-to-date: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalface.xml
-- Up-to-date: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalface_improved.xml
-- Up-to-date: /usr/local/share/opencv4/lbpcascades/lbpcascade_profileface.xml
-- Up-to-date: /usr/local/share/opencv4/lbpcascades/lbpcascade_silverware.xml
-- Installing: /usr/local/bin/opencv_annotation
-- Set runtime path of "/usr/local/bin/opencv_annotation" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_visualisation
-- Set runtime path of "/usr/local/bin/opencv_visualisation" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_interactive-calibration
-- Set runtime path of "/usr/local/bin/opencv_interactive-calibration" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_version
-- Set runtime path of "/usr/local/bin/opencv_version" to "/usr/local/lib"
eric@eric-PC:~/Documents/work/linux/opencv/build$
- 查看opencv是否安装成功
eric@eric-PC:~/Documents/work/linux/opencv/build$ pkg-config --modversion opencv
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
提示 opencv.pc 没有找到(理论上应该自动会生成,但是不知为何没有自动生成,那就手动添加吧!)
- 新建/usr/local/lib/pkgconfig/opencv.pc,内容如下:
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/opencv4
Name: opencv
Description: opencv compression library
Version: 4.5.0
Requires:
Libs: -L${libdir} -lopencv_calib3d -lopencv_dnn -lopencv_flann -lopencv_highgui -lopencv_imgproc -lopencv_objdetect -lopencv_stitching -lopencv_video -lopencv_core -lopencv_features2d -lopencv_gapi -lopencv_imgcodecs -lopencv_ml -lopencv_photo -lopencv_videoio
Cflags: -I${includedir}
eric@eric-PC:/usr/local/lib/pkgconfig$ ls opencv*
opencv.pc
- 测试
eric@eric-PC:~/Documents/work/linux/opencv/build$ pkg-config --modversion opencv
4.5.0
eric@eric-PC:~/Documents/work/linux/opencv/build$
eric@eric-PC:~/Documents/work/linux/opencv/build$ pkg-config --cflags --libs opencv
-I/usr/local/include/opencv4 -L/usr/local/lib -lopencv_calib3d -lopencv_dnn -lopencv_flann -lopencv_highgui -lopencv_imgproc -lopencv_objdetect -lopencv_stitching -lopencv_video -lopencv_core -lopencv_features2d -lopencv_gapi -lopencv_imgcodecs -lopencv_ml -lopencv_photo -lopencv_videoio
eric@eric-PC:~/Documents/work/linux/opencv/build$
- 编写测试程序
eric@eric-PC:~/Documents/work/linux-c/opencv$ tree
.
├── Makefile
└── src
└── main.cpp
1 directory, 2 files
main.cpp:
#include "opencv2/opencv.hpp"
#include "iostream"
using namespace std;
using namespace cv;
#define WINDOW_NAME "main"
int main()
{
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
Mat image;
// image = imread("test.jpg");
image = Mat(240,320,CV_8UC3,Scalar(0,255,0));
cout << "-------------------- 图像参数 ----------------------"<<endl;
//标志位
cout << "flags:" << image.flags << endl;
//图像尺寸
cout << "size:" << image.size << endl;
//列宽
cout << "clos:" << image.cols<<endl;
//行高
cout << "rows:" << image.rows << endl;
//维度
cout << "dims:" << image.dims << endl;
imshow(WINDOW_NAME,image);
waitKey(0);
return 0;
}
Makefile:
######################################
# eric
######################################
## 指定编译工具
CC = gcc
CPP = g++
RM = rm -rf
## 源文件路径(默认检索3层)
SRC_PATH := ./src
DIRS := $(shell find $(SRC_PATH) -maxdepth 3 -type d)
## 目标文件名称
TARGET := main
## 获取所有.c文件路径
SRCS += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
SRCPPS += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
## 所有对应目标文件
OBJS := $(SRCS:.c=.o) $(SRCPPS:.cpp=.o)
## 所有用到的库
LIBS := pthread m # mbedtls mbedcrypto mbedx509
## 指定头文件路径
INCLUDE_PATH := . $(DIRS) #/usr/local/include/opencv4/
## 指定库文件路径
LIB_PATH := /lib /usr/local/lib #./libmbedtls
## 编译参数初始化
CFLAGS := -g -O3 -pthread #-Wall
## 加载头文件路径
CFLAGS += $(foreach dir, $(INCLUDE_PATH), -I$(dir))
CFLAGS += `pkg-config --cflags --libs opencv`
## 加载库文件路径
LDFLAGS += $(foreach libdir, $(LIB_PATH), -L$(libdir))
## 加载库文件
LDFLAGS += $(foreach lib, $(LIBS), -l$(lib))
.PHONY:all
all: $(TARGET)
$(TARGET) :$(OBJS)
@$(CPP) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
@#$(RM) $(OBJS)
@echo =============================
@echo $(TARGET) ok
%.o : %.c
@echo srcs=$(SRCS)
@echo $@...
@$(CC) -c $(CFLAGS) $< -o $@
%.o : %.cpp
@echo srcpps=$(SRCPPS)
@echo LDFLAGS=$(LDFLAGS)
@echo OBJS=$(OBJS)
@echo $@...
@$(CPP) -c $(CFLAGS) $< -o $@
# %.o : %.S
# $(CC) -c $(CFLAGS) $< -o $@
.PHONY:clean
clean:
$(RM) $(OBJS) $(TARGET)
- 运行测试程序
eric@eric-PC:~/Documents/work/linux-c/opencv$ make
srcpps= ./src/main.cpp
LDFLAGS= -L/lib -L/usr/local/lib -lpthread -lm
OBJS= ./src/main.o
src/main.o...
=============================
main ok
eric@eric-PC:~/Documents/work/linux-c/opencv$ ./main
(main:109690): Gtk-WARNING **: 10:33:01.532: 无法在模块路径中找到主题引擎:“adwaita”,
(main:109690): Gtk-WARNING **: 10:33:01.533: 无法在模块路径中找到主题引擎:“adwaita”,
-------------------- 图像参数 ----------------------
flags:1124024336
size:240 x 320
clos:320
rows:240
dims:2