2021-11-07

Linux C++ opencv 学习记录-1


前言

待定。


一、版本,下载及环境配置

1.下载

ubuntu20.04–opencv4.5.0。
opencv下载:link
doucumentation: link
github: link(从tag中可选择opencv及opencv_contrib的版本,安装时二者必须版本相同)

2.环境配置及opencv安装

官网提供opencv在linux下的安装方法。link
另外一个参考。link
csdn参考:
Ubuntu 20.04搭建OpenCV 4.5.0 & C++环境link
Ubuntu 18.04安装c++版OpenCV4link
ubuntu 20.04安装 opencv-4.5和opencv-contrib-4.5link
ubuntu安装opencv的c++开发环境link

可配置显卡加速(尚未验证是否有加速)。link
此方法中cmake选项要根据自己情况修改,CUDA_ARCH_BIN是自己显卡的计算能力,官网可查,我的是gtx960m,计算能力5.0,CUDA_ARCH_BIN就是5.0;OPENCV_EXTRA_MODULES_PATH这个也要根据自己对应的路径进行修改。
我删掉了python相关的选项:

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \
-D WITH_CUDA=ON \
-D BUILD_opencv_cudacodec=OFF \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=5.0 \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_GSTREAMER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/gao/opencv_contrib/modules \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=ON \
-D GLIBCXX_USE_CXX11_ABI=0 ..

cmake修改可参考opencv官网link
要注意的是cmake默认不生成opencv.pc,缺少这个文件会导致后续出麻烦。
-D OPENCV_GENERATE_PKGCONFIG=ON
-D OPENCV_PC_FILE_NAME=opencv.pc
所以这两个比较有用,生成的文件在 /usr/local/lib/pkgconfig 路径下。

安装完之后就是环境配置,参考的是上面提到的csdn博客。
配置第一个

sudo gedit /etc/ld.so.conf.d/opencv.conf //可自行创建

在其中添加 /usr/local/lib ,然后

sudo ldconfig       // 更新一下系统的共享链接库

配置第二个

sudo gedit /etc/bash.bashrc 

末尾添加

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export LD_LIBRARY_PATH=/home/gao/opencv/build/lib:$LD_LIBRARY_PATH

然后

source /etc/bash.bashrc //据说这个要重启系统才会生效

这个比较全:
linux下设置opencv环境变量list

常用的几个命令:

nproc //查看cpu核数
dpkg -l | grep cudnn  //查看cuda和cudnn版本
nvcc --version //或者这个
nvidia-smi  //查看显卡型号

cuda:cuda_11.1;cudnn:libcudnn8.0.5.39-1

二、测试,是上面提到的github教程中的样例

#include <iostream>
#include <ctime>
#include <cmath>
#include "bits/time.h"

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>

#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudaimgproc.hpp>

#define TestCUDA true

int main() {
    std::clock_t begin = std::clock();

        try {
            cv::String filename = "自己图像的完整文件名,包括路径";
            cv::Mat srcHost = cv::imread(filename, cv::IMREAD_GRAYSCALE);

            for(int i=0; i<1000; i++) {
                if(TestCUDA) {
                    cv::cuda::GpuMat dst, src;
                    src.upload(srcHost);

                    //cv::cuda::threshold(src,dst,128.0,255.0, CV_THRESH_BINARY);
                    cv::cuda::bilateralFilter(src,dst,3,1,1);

                    cv::Mat resultHost;
                    dst.download(resultHost);
                } else {
                    cv::Mat dst;
                    cv::bilateralFilter(srcHost,dst,3,1,1);
                }
            }

            //cv::imshow("Result",resultHost);
            //cv::waitKey();

        } catch(const cv::Exception& ex) {
            std::cout << "Error: " << ex.what() << std::endl;
        }

    std::clock_t end = std::clock();
    std::cout << double(end-begin) / CLOCKS_PER_SEC  << std::endl;
}
$ g++ test.cpp `pkg-config opencv --cflags --libs` -o test
$ ./test

运行的话include这里会出错,应该是/usr/local/include/opencv4/opencv2,路径这里出错了,我把opencv2文件夹拷贝到上一级,竟然可以了。

3.其他

1.安装遇到的问题

编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件link
opencv卸载重装link

2.spacevim安装

官方安装link
Ubuntu配置SpaceVim与C/C++环境link

3.代码运行遇到的问题

spacvim中的runner不能运行opencv代码,会出现undefined reference…,但是在terminal中却可以正常运行,因为terminal中添加了 pkg-config opencv --cflags --libs这段代码。其作用是把 opencv4 的头文件路径和库文件列出来,让编译去获取。–cflags 和 --libs 分别指定头文件和库文件link。而spacevim中的runner没有自定义的命令,它默认在tem文件夹下创建一个运行文件夹,用默认的命令运行,运行结束后删除对应文件。
关于pkg-config:
快速指南:pkg-config 的原理和使用方法link

4.不要更新linux内核,不要sudo apt upgrade

忘记安装什么的时侯upgrade了一下,结果把linux内核更新了,然后indicator-sysmonitor无法工作,再一看显卡信息也无法查询,nvdia-smi用不了,搜了好久才发现内核被更新了。。。。。

第一步
查看现在运行的内核版本

uname -a //或者 uname -r

查看所有已下载的内核link

cat /boot/grub/grub.cfg | grep menuentry

第二步
查看内核、nvidia驱动、Cuda、cudann版本对应关系link
官网查看link,在对应版本的documentation里面link

第三步
修改默认启动内核link

GRUB_DEFAULT=''  //引号里面我用的是自己对应的内核版本名字,老式的命令形式更改失败
GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux xxx'//用它提示的新的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值