Ubuntu16.04+opencv3.2编译

1.下载opencv3.2:https://opencv.org/opencv-3-2.html

2.解压,创建build目录

1.cd opencv3.2
2.mkdir build

3.配置opencv,生成Makefile

cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_FFMPEG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..

我没有添加第三方模块

如果添加第三方库opencv_contrib则改为


cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_FFMPEG=ON -D CMAKE_INSTALL_PREFIX=/usr/local .. -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ..

如果因为ippicv_linux_20151201.tgz包下载失败而导致Makefile生成失败,可在https://github.com/opencv/opencv_3rdparty/blob/ippicv/master_20151201/ippicv/ippicv_linux_20151201.tgz通过手动下载ippicv_linux_20151201.tgz安装包,将其拷贝至 opencv-3.2.0/3rdparty/ippicv/downloads/linux-8b449a536a2157bcad08a2b9f266828b目录内,并删除CMakeCache.txt重新执行配置命令即可

 

若出现CMake Error: The following variables are used in this project, but they are set to NOTFOUND. Please set them or make sure they are set and tested correctly in the CMake files: CUDA_nppi_LIBRARY (ADVANCED)

是因为cuda9.0 不支持 2.0的架构

解决办法:

(1)找到FindCUDA.cmake文件

找到行

find_cuda_helper_libs(nppi)

修改为

  find_cuda_helper_libs(nppial)
  find_cuda_helper_libs(nppicc)
  find_cuda_helper_libs(nppicom)
  find_cuda_helper_libs(nppidei)
  find_cuda_helper_libs(nppif)
  find_cuda_helper_libs(nppig)
  find_cuda_helper_libs(nppim)
  find_cuda_helper_libs(nppist)
  find_cuda_helper_libs(nppisu)
  find_cuda_helper_libs(nppitc)
(2)

找到

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

改为

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")
 

 

(3)找到

unset(CUDA_nppi_LIBRARY CACHE)

改为

unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)
 

(4)

找到文件OpenCVDetectCUDA.cmake,把原来的

...

  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  ...

改为

...  
set(__cuda_arch_ptx "")  
if(CUDA_GENERATION STREQUAL "Kepler")  
  set(__cuda_arch_bin "3.0 3.5 3.7")  
elseif(CUDA_GENERATION STREQUAL "Maxwell")  
  set(__cuda_arch_bin "5.0 5.2")  
...  


(5)

在文件opencv\modules\cudev\include\opencv2\cudev\common.hpp中添加

#include <cuda_fp16.h>

重新编译

4.

编译

make -j8

若出现错误:Unsupported gpu architecture 'compute_20'

是因为cuda版本问题,我的是cuda9.0

其实只要在编译的时候加一句话就好了

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler

关键就是在最后指定使用Kepler

 

5.

安装

sudo make install

6.

查看版本号

pkg-config --modversion opencv

7.测试

代码

首先获取官方代码DisplayImage.cpp
 

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv )
{

    if ( argc != 2 )
    {
        cout<<"usage: DisplayImage.out <Image_Path>\n";
        return -1;
    }
    Mat image;
    image = imread( argv[1], 1 );
    if ( !image.data )
    {
        cout<<"No image data \n";
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);
    waitKey(0);
    return 0;
}

创建CMakeLists.txt文件

# cmake needs this line
cmake_minimum_required(VERSION 2.8)

# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

# Define project name
project(DisplayImage)

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)  
include_directories( ${OpenCV_INCLUDE_DIRS} )  
# Declare the executable target built from your sources
add_executable(DisplayImage DisplayImage.cpp)

# Link your application with OpenCV libraries
target_link_libraries(DisplayImage ${OpenCV_LIBS})

 生成可执行文件

 

 

1.mkdir build #建造build文件夹
2.cd build
3.cmake ..#有空格
4.make

 

执行以下代码

执行以下代码

1 在终端输入ls

2.运行./DisplayImage 001.jpg  

 

10.18更新,更新cuda后,重新编译opencv,

1.提示问题:precomp.hpp:60:37: fatal error: dynlink_nvcuvid.h

原因:CUDA有一些接口过期了。

解决办法:

cmake增加选项:-D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D BUILD_opencv_cudacodec=ON

2.提示问题fatal error: LAPACKE_H_PATH-NOTFOUND/lapacke.h: No such file or directory #include “LAPACKE_H_PATH-NOTFOUND/lapacke.h”
原因:未找到lapacke.h文件
方法:
sudo apt-get install liblapacke-dev checkinstall
修改出现问题的文件,例如我的文件是
opencv-3.2.0/build/opencv_lapack.h
将第二行中的#include"LAPACKE_H_PATH-NOTFOUND/lapacke.h" 修改为#include"lapacke.h"即可

 

2020更新 调用openncv出现error while loading shared libraries: libopencv_highgui.so.3.2: cannot open

1.打开/etc/ld.so.conf

 在文件中加上一行 /usr/loacal/lib

 再运行sudo ldconfig

2.修改.bashrc文件

在文件末尾加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

source /etc/bash.bashrc

即可

 

调用视频出现Unable to stop the stream: Inappropriate ioctl for device,表示为打开ffmpeg

# 安装编译工具
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,更新时间较长,请耐心等待。

sudo apt-get install ffmpeg

重新编译即可

 

 

2021.2.22 arm交叉编译opencv

1.参考https://blog.csdn.net/SMF0504/article/details/105305190/

编译成功之后,如果在板子上运行时,出现

error while loading shared libraries: …/…/lib/libopencv_features2d.so: cannot open shared object file: No such file or directory等错误

出现问题的原因是因为配置cmake时填写的时arm-linux,应该填写Linux,进行重新配置编译生成库就行了

 

 

测试代码

#include <opencv2/opencv.hpp>
 
using namespace cv; 
 
int main( int argc, char** argv )  
{  
	Mat image;  
 
	image = imread( "test.png", 1 );  
	if( !image.data )  
	{  
		printf( "No image data \n" );  
		return -1;  
	}   
 
	cv::Point lu = cv::Point(180, 60); 
	cv::Point rd = cv::Point(400, 260);   
 
	cv::rectangle(image, lu, rd, cv::Scalar( 255, 20, 0 ), 1, CV_AA );                 	
 
	imwrite("test_draw.jpeg", image);        
 
	return 0;  
}

编译代码arm-himix200-linux-g++ -o draw_image draw_image.cpp -I ./include/ ./lib/libopencv_core.so ./lib/libopencv_imgcodecs.so ./lib/libopencv_imgproc.so

 

如果出现pthread问题,则在上面命令中加入 -pthread -ldl

 

 

如果出现/mnt/opencv-arm-install/lib/libopencv_core.so.3.4: symbol _ZNSt15__exception_ptr13exception_ptrC1Ev, version CXXABI_1.3.11 not defined in file libstdc++.so.6 with link time reference

则将/opt/hisi-linux/x86-arm/arm-himix200-linux/arm-linux-gnueabi/lib/libstdc++.so.6.0.23复制到板子上/usr/lib 并执行

ln -s libstdc++.so.6.0.23 libstdc++.so.6

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值