目录
一、Opencv完全卸载
二、安装opencv
opencv3.x版本与4.x版本的安装过程一致
一、Opencv完全卸载
进入原先编译opencv2的build目录,在该目录下打开终端;再执行以下代码。(注意如果build已经删除了,可以重新编译一遍该版本的opencv,然后在最后一步执行sudo make uninstall)
1.
sudo make uninstall
cd ..
sudo rm -r build
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*
2.代码执行后会报错,忽略掉
sudo apt-get --purge remove opencv-doc opencv-data python-opencv
3.检查
用以下代码检查opencv是否卸载干净
pkg-config opencv --libs
pkg-config opencv --modversion
若仍能显出opencv的相关信息,则存在两种可能:
可能一:未卸载干净
执行以下代码
sudo apt-get autoremove opencv-doc opencv-data libopencv-dev libopencv2.4-java libopencv2.4-jni python-opencv libopencv-core2.4 libopencv-gpu2.4 libopencv-ts2.4 libopencv-photo2.4 libopencv-contrib2.4 libopencv-imgproc2.4 libopencv-superres2.4 libopencv-stitching2.4 libopencv-ocl2.4 libopencv-legacy2.4 libopencv-ml2.4 libopencv-video2.4 libopencv-videostab2.4 libopencv-objdetect2.4 libopencv-calib3d2.4
可能二:
库已经被删除,但系统里仍保留了配置文件
打开/usr/local/lib/pkgconfig文件夹,发现有一个opencv.pc,打开该文件,里面写有包含路径与库路径,确保包含路径与库路径均被清空后,删除该pc文件,重新执行pkg-config opencv --libs pkg-config opencv --modversion
显示下面这样就可
No package ‘opencv’ found
二、安装opencv
安装教程以3.4.2为例
2.1 下载源代码
**下载opencv3.4.2和opencv-contrib-3.4.2,各版本opencv的gitee镜像下载链接,各版本opencv contrib的gitee镜像下载链接
2.2 安装依赖
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
执行sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
后遇到问题
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:
下列软件包有未满足的依赖关系:
libopencv-dev : 依赖: libopencv-calib3d2.4v5 但是它将不会被安装
依赖: libopencv-highgui2.4v5 但是它将不会被安装
依赖: libopencv-ml2.4v5 但是它将不会被安装
依赖: libopencv-objdetect2.4v5 但是它将不会被安装
依赖: libopencv-core-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是 2.4.9.1+dfsg-1.5ubuntu1.1 正要被安装
依赖: libopencv-ml-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-imgproc-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是 2.4.9.1+dfsg-1.5ubuntu1.1 正要被安装
依赖: libopencv-video-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-objdetect-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-highgui-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-calib3d-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-flann-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是 2.4.9.1+dfsg-1.5ubuntu1.1 正要被安装
依赖: libopencv-features2d-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是 2.4.9.1+dfsg-1.5ubuntu1.1 正要被安装
依赖: libopencv-legacy-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-contrib-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-ts-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-photo-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-videostab-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-stitching-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-gpu-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-superres-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv-ocl-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv2.4-java (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libopencv2.4-jni (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libcv-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libhighgui-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
依赖: libcvaux-dev (= 2.4.9.1+dfsg-1.5ubuntu1xqms2~xenial1) 但是它将不会被安装
推荐: opencv-data 但是它将不会被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
原因:源文件过时,更新源文件
解决方法:
打开/etc/apt/sourcelist.txt,将其中的源文件更换为下面几个:
deb http://cn.archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
执行sudo apt-get update
,更新时间较长,请耐心等待。
2.3 解压
解压opencv3.4.0和opencv_contrib3.4.0文件,将后者移动到opencv3.4.0文件夹中;
将opencv3.4.0更名为opencv,opencv_contrib文件更名为opencv_contrib;
在opencv文件中新建文件夹build
opencv文件长这样
cd ~/opencv/build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules/ ..
/usr/local 是指默认将要 install 的路径
OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules/ … 是指 opencv_contrib3.4.0 中 modules所在的路径,后面的两点不可省略
如果编译失败,检查CMakeerror.log,出现#error "C++11 is not supported"
以下问题,请再检查一遍opencv_contrib文件中的modules路径是否正确
Compilation failed:
source file: '/home/ning/0.Software/opencv-3.4.1/cmake/checks/cxx11.cpp'
check option: ''
===== BUILD LOG =====
Change Dir: /home/ning/0.Software/opencv-3.4.1/build/CMakeFiles/CMakeTmp
Run Build Command:"/usr/bin/make" "cmTC_4a8b7/fast"
/usr/bin/make -f CMakeFiles/cmTC_4a8b7.dir/build.make CMakeFiles/cmTC_4a8b7.dir/build
make[1]: Entering directory '/home/ning/0.Software/opencv-3.4.1/build/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_4a8b7.dir/cxx11.cpp.o
/usr/bin/c++ -fPIE -o CMakeFiles/cmTC_4a8b7.dir/cxx11.cpp.o -c /home/ning/0.Software/opencv-3.4.1/cmake/checks/cxx11.cpp
/home/ning/0.Software/opencv-3.4.1/cmake/checks/cxx11.cpp:4:2: error: #error "C++11 is not supported"
#error "C++11 is not supported"
^
/home/ning/0.Software/opencv-3.4.1/cmake/checks/cxx11.cpp: In function ‘int main()’:
/home/ning/0.Software/opencv-3.4.1/cmake/checks/cxx11.cpp:11:10: error: ‘res’ does not name a type
auto res = test();
^
/home/ning/0.Software/opencv-3.4.1/cmake/checks/cxx11.cpp:12:12: error: ‘res’ was not declared in this scope
return res;
^
CMakeFiles/cmTC_4a8b7.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_4a8b7.dir/cxx11.cpp.o' failed
make[1]: *** [CMakeFiles/cmTC_4a8b7.dir/cxx11.cpp.o] Error 1
make[1]: Leaving directory '/home/ning/0.Software/opencv-3.4.1/build/CMakeFiles/CMakeTmp'
Makefile:126: recipe for target 'cmTC_4a8b7/fast' failed
make: *** [cmTC_4a8b7/fast] Error 2
===== END =====
2.4 编译安装
sudo make -j4
sudo make install
2.4.1 可能问题一:fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
make时可能会出现fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
,此时需要在cmakelist中添加INCLUDE_DIRECTORIES("/home/ning/Software/opencv3.4.1/opencv_contrib/modules/xfeatures2d/include"
2.4.2 可能问题二: IPPICV: Download failed: 35;“SSL connect error”
-- IPPICV: Download:ippicv_xxx.tgz
-- Try 1 failed
CMake Warning at cmake/OpenCVDownload.cmake:202 (message):
IPPICV: Download failed: 35;"SSL connect error"
For details please refer to the download log file:
/media/ning/29fd6791-d64c-4500-a628-eb9dcc9102fd/ning/1.software/opencv-4.5.1
(2)/build/CMakeDownloadLog.txt
原因:这个网站被墙了,可以试试科学上网然后重新编译,不能科学上网的话可以参考如下方式
**解决办法:**下载别人分享的链接,现在博主有的ippicv版本如下所示,资源链接为:
- ippicv_2017u3_lnx_intel64_general_20170822.tgz
- ippicv_2020_lnx_intel64_20191018_general.tgz
- ippicv_linux_20141027.tgz
- ippicv_macosx_20141027.tgz
- ippicv_windows_20141027.zip
2.4.3 可能问题三: ADE: Download failed: 35;“SSL connect error”
-- ADE: Download: v0.1.1f.zip
-- Try 1 failed
CMake Warning at cmake/OpenCVDownload.cmake:202 (message):
ADE: Download failed: 35;"SSL connect error"
For details please refer to the download log file
/media/ning/29fd6791-d64c-4500-a628-eb9dcc9102fd/ning/1.software/opencv-4.5.1
(2)/build/CMakeDownloadLog.txt
解决办法一:改为用自己手机共享网络,网速好的话,可以直接下载通过
**解决办法二:**打开https://github.com/opencv/ade/tags,下载v0.1.1f.zip,放入opencv/.cache/ade文件夹下,并更名为b624b995ec9c439cbc2e9e6ee940d3a2-v0.1.1f.zip
(如过opencv文件夹下没有.cache文件夹,尝试同时按下Ctrl+Shift+H来显示隐藏文件夹)
2.4.4 可能问题四:fatal error: boostdesc_bgm.i: No such file or directory compilation terminated
还会出现fatal error: boostdesc_bgm.i: No such file or directory compilation terminated.
的问题,
解决办法一:打开cmakedownload.txt搜索boostdesc_bgm.i查看下载链接,自己点进链接下载,我电脑不能科学上网,无法打开网页,所以找了资源,也就是下面这种解决办法。
解决办法二:直接用别人分享的,链接: https://pan.baidu.com/s/1LwuXsAAHIizlHVx7Obd9fw 提取码: 3sw1 ,
把下载好的这几个文件复制到opencv_contrib/modules/xfeatures2d/src/
路径重新编译、安装就大功告成了!
解决办法三:链接: https://pan.baidu.com/s/1LwuXsAAHIizlHVx7Obd9fw 提取码: 3sw1 ,下载下来后放在opencv/.cache/xfeatures2d/boostdesc/文件夹下
2.4.5 可能问题五:fatal error: dynlink_nvcuvid.h: 没有那个文件或目录
这是由于cuda版本过高引起的,可以在编译时增加·-DWITH_CUDA=OFF ·关闭cuda
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -DWITH_CUDA=OFF -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules/ ..
2.4.6 可能问题六 cv2.cpp:885:34: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
/opencv3.4.0/modules/python/src2/cv2.cpp:885:34: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
解决办法
打开/opencv3.4.0/modules/python/src2/cv2.cpp文件,定位到885行,
将
char* str = PyString_AsString(obj);
修改为
const char* str = PyString_AsString(obj);
2.4.5 重新编译
解决完上述问题后再执行
make -j4
sudo make install
就可以啦
三、测试
3.1 查看opencv版本
Ctrl+Shift+T打开终端,输入如下命令
pkg-config opencv --modversion #4版本以下
opencv_version #4版本以上
3.2 代码测试
创建一个新的文件夹temp,内含CMakeLists.txt、qr.cpp与一张含有二维码的图片1.jpg
3.2.1 CMakeLists.txt
文档内容如下:
# cmake need this line
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
project(QR)
find_package(OpenCV REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS})
add_executable(qr qr.cpp)
target_link_libraries(qr ${OpenCV_LIBS})
3.2.2 qr.cpp
文档内容为如下:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/imgproc/types_c.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace cv;
using namespace std;
Mat src; Mat src_gray;Mat src_out;
RNG rng(12345);
//轮廓中心点
Point Center_point(vector<vector<Point> > contours,int i)//找到所提取轮廓的中心点
{
int centerx=0,centery=0,n=contours[i].size();
//在提取的小正方形的边界上每隔周长个像素提取一个点的坐标,求所提取四个点的平均坐标(即为小正方形的大致中心)
centerx = (contours[i][n/4].x + contours[i][n*2/4].x + contours[i][3*n/4].x + contours[i][n-1].x)/4;
centery = (contours[i][n/4].y + contours[i][n*2/4].y + contours[i][3*n/4].y + contours[i][n-1].y)/4;
Point point1=Point(centerx,centery);
return point1;
}
int main( int argc, char** argv[] )
{
src = imread( "1.jpg", 1 );
//判断是否载入图像
if(src.empty())
{
fprintf(stderr, "Can not load image %s\n", 1);
return -1;
}
Mat src_all=src.clone();
//图像转化为灰度图像
cvtColor( src, src_gray, CV_BGR2GRAY );//opencv2.x颜色空间转换code用的宏定义是CV_前缀开头,opencv3之后则是COLOR_开头)
//图像滤波和均衡化会影响图像,影响下面轮廓检测
//medianBlur(src_gray, src_gray, 3); //中值滤波
// equalizeHist( src_gray, src_gray );//均衡化
Scalar color = Scalar(1,1,255 );//RGB颜色值分别为1,1,255
Mat drawing = Mat::zeros( src.size(), CV_8UC3 );//画布
Mat drawing2 = Mat::zeros( src.size(), CV_8UC3 );//画布
//图像二值化
Mat src_threshold;
threshold(src_gray, src_threshold, 112, 255, THRESH_BINARY );//threshold(const Mat& src, Mat& dst, double thresh,double maxVal, int thresholdType );
//对图像进行轮廓检测,调用查找轮廓函数
vector<vector<Point> > contours,contours2;
vector<Vec4i> hierarchy;
findContours( src_threshold, contours, hierarchy, CV_RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0) );//CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓内.CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内
int c=0,ic=0,k=0,area=0,i=0;
//寻找有两个子轮廓的父轮廓
int parentIdx=-1;
for( int i = 0; i< contours.size(); i++ )//contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数
{
if (hierarchy[i][2] != -1 && ic==0)//有子轮廓
{
parentIdx = i;
ic++;
}
else if (hierarchy[i][2] != -1)
{
ic++;
}
else if(hierarchy[i][2] == -1)//无子轮廓
{
ic = 0;
parentIdx = -1;
}
//有两个子轮廓
if ( ic >= 2)
{
contours2.push_back(contours[parentIdx]);//保存找到的黑色定位角
drawContours( drawing, contours, parentIdx, CV_RGB(255,0,0) , 1, 8);//画出三个黑色定位角的轮廓
ic = 0;
parentIdx = -1;
area = contourArea(contours[i]);//得出一个二维码定位角的面积,以便计算其边长(area_side)
}
}
//填充轮廓
for(int i=0; i<contours2.size(); i++)
drawContours( drawing2, contours2, i, CV_RGB(255,0,0) , -1, 4, hierarchy[k][2], 0, Point() );
//获取三个定位角的中心坐标
Point point[3];
for(int i=0; i<contours2.size(); i++)
{
point[i] = Center_point( contours2, i );
}
//计算轮廓的面积,计算定位角的面积,从而计算出边长
area = contourArea(contours2[0]);///
int area_side = cvRound (sqrt (double(area)));
//连接三个黑色正方形区域,形成一个轮廓
for(int i=0; i<contours2.size(); i++)
{
//三个定位角连线
line(drawing2,point[i%contours2.size()],point[(i+1)%contours2.size()],CV_RGB(100,100,255),area_side/2,8);
}
//框出这整个二维码
Mat gray_all,src_treshold_all;
vector<vector<Point> > contours_all;
vector<Vec4i> hierarchy_all;
cvtColor( drawing2, gray_all, CV_BGR2GRAY );
threshold( gray_all, src_treshold_all, 45, 255, THRESH_BINARY );
findContours( src_treshold_all, contours_all, hierarchy_all, RETR_EXTERNAL, CHAIN_APPROX_NONE, Point(0, 0) );//RETR_EXTERNAL表示只寻找最外层轮廓
//求最小包围矩形
RotatedRect rectPoint = minAreaRect(contours_all[0]);
Point2f fourPoint2f[4]; //矩形的质心
//将rectPoint变量中存储的坐标值放到 P的数组中
rectPoint.points(fourPoint2f);
for (int i = 0; i < 4; i++)
{
line(src_all, fourPoint2f[i%4], fourPoint2f[(i + 1)%4], Scalar(20,21,237), 3);
}
imshow( "二维码", src_all );
waitKey(0);
return(0);
}
3.2.3 运行
cmake .
make
./qr 1.jpg
3.2.4 可能问题
安装后再运行程序进行测试,可能有如下问题
CMake Error at /usr/local/lib/cmake/opencv4/OpenCVModules.cmake:166 (message):
The imported target "opencv_core" references the file
"/usr/local/lib/libopencv_core.so.4.1.1"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
"/usr/local/lib/cmake/opencv4/OpenCVModules.cmake"
but not all the files it references.
Call Stack (most recent call first):
/usr/local/lib/cmake/opencv4/OpenCVConfig.cmake:126 (include)
CMakeLists.txt:4 (find_package)
-- Configuring incomplete, errors occurred!
See also "/home/ning/软件/测试opencv/CMakeFiles/CMakeOutput.log".
原因:4.1.1版本未卸载干净
解决方法:进入/usr/local/lib/cmake/opencv4文件夹,将opencvmodeles.cmake之外的文档删除,重新进入opencv/build文件夹执行以下代码
sudo make
sudo make install
安装完opencv后再重新进行步骤3.2.3
3.3 测试结果
应为:如图,二维码被顺利框选出