note

一、OpenCV安装

说明:

  1. 首先要注意一点,下载好的win上的opencv中build文件夹中的是编译好的MSVC版,vs直接用是没问题的,但是当vs,clcion这些要编译opencv相关的,就是调用的本地mingw的gcc以及g++,那么MSVC版本就是不能用的,编译链接的时候就会失败。凡是与opencv相关的代码,就会报错==undefined reference to …==。若要使用mingw去编译,就要拿到opencv源码,然后用它编译处属于自己的版本。
  2. 针对linu环境,第一次都要先安装一些第三方依赖,不然在后续使用到类似namedWindows这样做窗口展示时就会报错,后面再编译其它版本就不需要了。
  3. 注意:可以看看learnopncv的InstallScripts(里面.sh脚本的其它的就不要了吧,不然又很多问题,难得搞)结合起来操作,里面有把opencv_contrib模块一起编译的方法。(强推去看)(没这个模块可能一些算法就没有,普通编译就会“fatal error: opencv2/==aruco.hpp==: No such file or directory”) 然后针对ippicv和一些需要在线下载的三方库,opencv是在cmake时,将其下载在opencv源码的.cache文件夹里,可以按照其提示的下载地址,提前下载到对应位置。可以参考和这个教程
  4. 尝试编译时把cuda用起来吧,还有英伟达的gpu硬件解码的Video_Codec_SDK库(NVCUVID要得),然后要勾选勾选 WITH_CUDA和WITH_NVCUVID。方便需要可能有需要。看一下这个教程

1.1 依赖

肯定是先把 gcc gcc-c++ kernel-devel gcc-gfortran git make 这些安装好,然后手动安装cmake,自动安装的cmake版本太低了,安装后也要升级的。

  1. yum install libgnomeui-devel gnome-devel gnome-devel-docs #(安装gtk 图形化界面库)安装必要文件包(第一个),后面是可选
  2. yum install gtk2 gtk2-devel gtk2-devel-docs # 为了支持GUI特征,没有这,编译可能会成功,但是使用时,imshow()这样的代码在编译或是使用时就会报错
  3. yum install gstreamer-plugins-base-devel gstreamer-devel.x86_64 gstreamer-ffmpeg.x86_64
  4. yum install boost boost-thread boost-devel
  5. yum install libdc1394-devel libv4l-devel # 为了支持摄像头
  6. yum install eigen3-devel
    • # 找不到就简单源码安装就好了,这是官方地址,它的一些函数的使用
  7. yum install freeglut-devel libtiff-devel python-devel numpy
  8. yum install lapack-devel.x86_64 # 线性函数库
  9. yum install mesa-libGL mesa-libGL-devel # Mesa: 3D是一个在MIT许可证下开放源代码的三维计算机图形库,以开源形式实现了OpenGL的应用程序接口
  10. yum install nasm mercurial libtool zlib-devel
  11. yum install openexr-devel libwebp-devel libjpeg-turbo-devel libpng-devel jasper-devel # 图形文件解码库更新
  12. yum install tbb-devel # 线程构建模块 Intel’s Threading Building Blocks (TBB),是Intel公司开发的并行编程开发的工具。
  13. yum install openblas-devel.x86_64 # OpenBLAS是一个基于BSD许可(开源)发行的优化BLAS计算库
  14. yum install atlas-devel.x86_64 # BLAS线性算法库的优化版本。

ffmpeg组件安装(其实都是ffmpeg的安装),看这里

1.2 编译

这里有一个很对编译选项打开或是关闭的demo,就随便看看。

以opencv3为例,来手动编译,不添加环境变量,假设开始操作前的路径是/opt/

  1. wget https://github.com/opencv/opencv/archive/3.4.13.zip
    https://github.com/opencv/opencv/archive/4.8.0.zip # 其它版本换对应版本号

  2. unzip 3.4.13.zip

  3. cd opencv-3.4.13

  4. mkdir build install // 创建两个文件夹

  5. cd build

  6. cmake -DCMAKE_INSTALL_PREFIX=../install .. // 就把文件安装在刚刚创建的 install 目录里(一定要提前创建,不然就全部在build中,不方便查看)

    1. cmake -D CMAKE_BUILD_TYPE=Debug \

      ​ -D CMAKE_INSTALL_PREFIX=../my_install/Debug -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.6.0/modules ..

      # 这种就是把opencv_contrib也编译进来,方便后续使用dnn模块,参看上面的说明第3.点(看情况吧,或许就先按照前面的来,这个opencv_contrib看需吧,一般也用不到)

  7. make -j4

  8. make install

​ 使用opencv自带的demo来进行测试,路径就是 /opt/opencv-4.1.2/samples/cpp/example_cmake/,cd进去,在这里面有三个文件CMakeLists.txtexample.cppMakefile,因为opencv是安装在此目录下的,且没有加环境变量的,所以无法直接make来使用Makefile的,可以按一下步骤来测试:

先修改CMakeLists.txt,要添加opencv的路径:

Tips:


==windows下编译MinGW版本==(做个参考了解吧,编译出来,程序能编译,但是poweshell运行直接没反应,cmd运行一直会报“无法定位程序输入点于动态链接库…”的错误):

总结:


pkgconfig配置参考

下面这种安装放弃了的,作为参考了解吧,主要是看它linux配置使用==pkgconfig环境==,若看pkgconfig与cmake的联合使用,看GCC编译器.md的4.6小节中的示例CMakeListst.txt:

一、以opencv-4.1.2为例,源码下载下来解压好

  1. cd opencv-4.1.2/
  2. mkdir build; cd build
  3. cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local .. # 这里一些选项开启
  4. make -j8
  5. make install

Tips:

  1. 以上命令将opencv4.1.2安装在了默认路径,默认各部分分别安装在/usr/local/目录的include/bin/lib/3个文件夹下;
  2. -D OPENCV_GENERATE_PKGCONFIG=ONOpenCV4以上版本默认不使用pkg-config,该编译选项开启生成opencv4.pc文件,支持pkg-config功能。

二、配置pkgconfig环境

  1. find / -name opencv4.pc 应该会得到这个 /usr/local/lib64/pkgconfig/opencv4.pc
  2. vim /etc/profile.d/pkgconfig.sh // 可能是一个空文件,写进步骤3的内容
  3. export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
  4. source /etc/profile
  1. vim /etc/ld.so.conf.d/opencv4.conf // 可能是一个空文件,写入步骤2的内容
  2. /usr/local/lib64
  3. ldconfig

成功后就可以查看opencv的版本:pkg-config --modversion opencv4

就会得到opencv的版本号 4.1.2;建议以后还是用这个版本吧,前面有用4.4.0版本,结合项目使用时,编译没问题,但是运行会报关于opencv的错误

三、测试demo

​ cd到 opencv-4.1.2/samples/cpp/example_cmake/文件夹下

​ 因为opencv4.0需要c++11支持,且生成的pkg-config文件名为opencv4.pc,所以需要对当前录下的Malefile文件进行修改,

原始Makefile内容的第2、3行内容如下:

​ CXXFLAGS += -c -Wall $(shell pkg-config –cflags opencv)

​ LDFLAGS += $(shell pkg-config –libs –static opencv)

要将其中的opecv改成opencv4,并指定--std=c++11,那么修改后的就是:

CXXFLAGS += -c –std=c++11 -Wall $(shell pkg-config –cflags opencv4)

LDFLAGS += $(shell pkg-config –libs –static opencv4)

当把Makefile文件改完后,直接在此执行make命令就可以得到执行文件了,当然也是可以用CMakeLists.txt通过cmake来构建。

​ Ps:以上的make编译的命令可以直接是:g++ example.cpp –std=c++11 ‘pkg-config –libs –cflags opencv4 -o opencv_example ​ // 注意:pkg-config --libs --cflags opencv4 是用键盘上ESC键位下的一对`包住的,这里因为格式的问题,直接复制的是不对的,记得修改。

​ 以后写关于使用了opencv的CMakeLists.txt时,记得去参考一下opencv的example中的写法,还是都加上Enable C++11下面那两句(不是必须,但有时没有这两句编译又会报错,所以最好加上): set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)


opencv4.pc中的内容,作为参考,以后有需要可自己写:

# Package Information for pkg-config

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib/x86_64-linux-gnu
includedir_old=${prefix}/include/opencv4/opencv
includedir_new=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.2.0
Libs: -L${exec_prefix}/lib/x86_64-linux-gnu -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}

同时把assimp库的“assimp.pc”内容也写这里吧:

libdir=/opt/assimp-5.2.5/my_install/lib64
includedir=/opt/assimp-5.2.5/my_install/include

Name: Assimp
Description: Import various well-known 3D model formats in an uniform manner.
Version: 5.2.4
Libs: -L${libdir} -lassimp
Libs.private: -lstdc++ -lz
Cflags: -I${includedir}

1.3 可能出现的问题

​ 在一个简单的centos上进行如上操作是没有任何问题的,但是在T60服务器上,可能是因为装了anaconda后,部分环境变量优先级的问题,以上方法都通过不了。

​ 当出现以下错误的时候,先试着去降低anaconda的环境变量的优先级,不行再按照以下方法去做。

​ 第一步cmake命令cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..不会出现异常,但是接下来的make编译的时候会报出如下错误:

/root/root/anaconda3/lib/libicui18n.so.58: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8’

/root/root/anaconda3/lib/libicui18n.so.58: undefined reference to `operator delete(void*, unsigned long)@CXXABI_1.3.9’

​ # 当然前面路径可能不是这样

解决办法:

  1. 比较简单的(凡是带conda的错误都这样解决)

    • echo $LD_LIBRARY_PATH # 获取LD_LIBRARY_PATH
    • export LD_LIBRARY_PATH= 把上面获取的值把关于anaconda的去掉

    这去掉只针对这一个窗口,是临时去掉,只针对这个窗口,然后再去cmake、make。

  2. 以下的解决办法可行,但是比较麻烦,

按照前面的步骤走完,最后就能通过 cmake、make、make install 所有步骤

​ 编译安装完成后,但可能还是无法编译通过opencv包里自带的一个demo实例(前面环境编译时多添加了一个参数,所以这里也需要添加),还需要做一些修改,有两种方式:

ubuntu18.0-opencv4

这是learnOpenCV项目中的,地址

ubuntu一定要安装到 “/usr/local” 下面,用户的访问才会很方便,其它位置可能有问题。

最好是自己先去建一个 /usr/local/opencv版本号 的目录,然后cmake时就把这个路径指定位安装路径

#!/bin/bash

echo "OpenCV installation by learnOpenCV.com"
# Define OpenCV Version to install 
cvVersion="master"

# Clean build directories
rm -rf opencv/build
rm -rf opencv_contrib/build

# Create directory for installation
mkdir installation
mkdir installation/OpenCV-"$cvVersion"

# Save current working directory
cwd=$(pwd)

sudo apt -y update
sudo apt -y upgrade

sudo apt -y remove x264 libx264-dev
 
## Install dependencies
sudo apt -y install build-essential checkinstall cmake pkg-config yasm
sudo apt -y install git gfortran
sudo apt -y install libjpeg8-dev libpng-dev
 
sudo apt -y install software-properties-common
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt -y update
 
sudo apt -y install libjasper1
sudo apt -y install libtiff-dev
 
sudo apt -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt -y install libxine2-dev libv4l-dev
cd /usr/include/linux
sudo ln -s -f ../libv4l1-videodev.h videodev.h
cd "$cwd"
 
sudo apt -y install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt -y install libgtk2.0-dev libtbb-dev qt5-default
sudo apt -y install libatlas-base-dev
sudo apt -y install libfaac-dev libmp3lame-dev libtheora-dev
sudo apt -y install libvorbis-dev libxvidcore-dev
sudo apt -y install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt -y install libavresample-dev
sudo apt -y install x264 v4l-utils
 
# Optional dependencies
sudo apt -y install libprotobuf-dev protobuf-compiler
sudo apt -y install libgoogle-glog-dev libgflags-dev
sudo apt -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

sudo apt -y install python3-dev python3-pip
sudo -H pip3 install -U pip numpy
sudo apt -y install python3-testresources

cd $cwd
############ For Python 3 ############
# create virtual environment
python3 -m venv OpenCV-"$cvVersion"-py3
echo "# Virtual Environment Wrapper" >> ~/.bashrc
echo "alias workoncv-$cvVersion=\"source $cwd/OpenCV-$cvVersion-py3/bin/activate\"" >> ~/.bashrc
source "$cwd"/OpenCV-"$cvVersion"-py3/bin/activate

# now install python libraries within this virtual environment
pip install numpy scipy matplotlib scikit-image scikit-learn ipython dlib --user
 
# quit virtual environment
deactivate

######################################

git clone https://github.com/opencv/opencv.git
cd opencv
git checkout $cvVersion
cd ..
 
git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout $cvVersion
cd ..

cd opencv
mkdir build
cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE \
            -D CMAKE_INSTALL_PREFIX=$cwd/installation/OpenCV-"$cvVersion" \
            -D INSTALL_C_EXAMPLES=ON \
            -D INSTALL_PYTHON_EXAMPLES=ON \
            -D WITH_TBB=ON \
            -D WITH_V4L=ON \
            -D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-$cvVersion-py3/lib/python3.6/site-packages \
        -D WITH_QT=ON \
        -D WITH_OPENGL=ON \
        -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
        -D BUILD_EXAMPLES=ON ..
	
make -j$(nproc)
make install

mediapipe中

这是mediapipe中的,也可以好好参考。

#!/bin/bash
# Copyright 2019 The MediaPipe Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# =========================================================================
#
# Script to build OpenCV from source code and modify the MediaPipe opencv config.
# Note that this script only has been tested on Debian 9 and Ubuntu 16.04.
#
# To have a full installation:
# $ cd <mediapipe root dir>
# $ sh ./setup_opencv.sh
#
# To only modify the mediapipe config for opencv:
# $ cd <mediapipe root dir>
# $ sh ./setup_opencv.sh config_only

set -e
if [ "$1" ] && [ "$1" != "config_only" ]
  then
    echo "Unknown input argument. Do you mean \"config_only\"?"
    exit 0
fi

opencv_build_file="$( cd "$(dirname "$0")" ; pwd -P )"/third_party/opencv_linux.BUILD
workspace_file="$( cd "$(dirname "$0")" ; pwd -P )"/WORKSPACE

if [ -z "$1" ]
  then
    echo "Installing OpenCV from source"
    if [[ -x "$(command -v apt)" ]]; then
      sudo apt update && sudo apt install build-essential git
      sudo apt install cmake ffmpeg libavformat-dev libdc1394-22-dev libgtk2.0-dev \
                       libjpeg-dev libpng-dev libswscale-dev libtbb2 libtbb-dev \
                       libtiff-dev
    elif [[ -x "$(command -v dnf)" ]]; then
      sudo dnf update && sudo dnf install cmake gcc gcc-c git
      sudo dnf install ffmpeg-devel libdc1394-devel gtk2-devel \
                       libjpeg-turbo-devel libpng-devel tbb-devel \
                       libtiff-devel
    fi
    rm -rf /tmp/build_opencv
    mkdir /tmp/build_opencv
    cd /tmp/build_opencv
    git clone https://github.com/opencv/opencv_contrib.git
    git clone https://github.com/opencv/opencv.git
    mkdir opencv/release
    cd opencv_contrib
    git checkout 3.4
    cd ../opencv
    git checkout 3.4
    cd release
    cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local \
          -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_ts=OFF \
          -DOPENCV_EXTRA_MODULES_PATH=/tmp/build_opencv/opencv_contrib/modules \
          -DBUILD_opencv_aruco=OFF -DBUILD_opencv_bgsegm=OFF -DBUILD_opencv_bioinspired=OFF \
          -DBUILD_opencv_ccalib=OFF -DBUILD_opencv_datasets=OFF -DBUILD_opencv_dnn=OFF \
          -DBUILD_opencv_dnn_objdetect=OFF -DBUILD_opencv_dpm=OFF -DBUILD_opencv_face=OFF \
          -DBUILD_opencv_fuzzy=OFF -DBUILD_opencv_hfs=OFF -DBUILD_opencv_img_hash=OFF \
          -DBUILD_opencv_js=OFF -DBUILD_opencv_line_descriptor=OFF -DBUILD_opencv_phase_unwrapping=OFF \
          -DBUILD_opencv_plot=OFF -DBUILD_opencv_quality=OFF -DBUILD_opencv_reg=OFF \
          -DBUILD_opencv_rgbd=OFF -DBUILD_opencv_saliency=OFF -DBUILD_opencv_shape=OFF \
          -DBUILD_opencv_structured_light=OFF -DBUILD_opencv_surface_matching=OFF \
          -DBUILD_opencv_world=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_xphoto=OFF \
          -DCV_ENABLE_INTRINSICS=ON -DWITH_EIGEN=ON -DWITH_PTHREADS=ON -DWITH_PTHREADS_PF=ON \
          -DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON
    make -j 16
    sudo make install
    rm -rf /tmp/build_opencv
    echo "OpenCV has been built. You can find the header files and libraries in /usr/local/include/opencv2/ and /usr/local/lib"

    # https://github.com/cggos/dip_cvqt/issues/1#issuecomment-284103343
    sudo touch /etc/ld.so.conf.d/mp_opencv.conf
    sudo bash -c  "echo /usr/local/lib >> /etc/ld.so.conf.d/mp_opencv.conf"
    sudo ldconfig -v
fi

# Modify the build file.
echo "Modifying MediaPipe opencv config"

sed -i '/linkopts/a \ \ \ \ \ \ \ \ \"-L/usr/local/lib",' $opencv_build_file
linux_opencv_config=$(grep -n 'linux_opencv' $workspace_file | awk -F  ":" '{print $1}')
path_line=$((linux_opencv_config + 2))
sed -i "$path_line d" $workspace_file
sed -i "$path_line i\    path = \"/usr/local\"," $workspace_file
echo "Done"

三、cmake安装

cmake就这样安装吧,通过yum或者apt-get安装的版本太低了,基本安装后也要这样升级。

cmake的下载地址:这里

二、gcc版本升级

gcc的下载地址:这里

​ 说明:一般装的centos7.*,原生的gcc –version == 4.8.5; g++ –version == 4.8.5(跟gcc一样的)

​ 当gcc版本低于4.9的时候,是不支持c++14的,很多时候make就会报错(详细的关于gcc版本支持的c++版本的对应关系:这里);然后就需要升级gcc,具体的方法:

​ 当升级完成后,随便写一个简单的.cpp文件以c++14去编译,可能会出现如下错误: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file,根据这里去解决就好了。

可能后面会遇到库的版本问题,就建议这样:

mv /usr/lib/gcc/ /usr/lib/gcc-4.8.5

ln -s /opt/rh/devtoolset-8/root/usr/lib/gcc /usr/lib/gcc

mv /usr/libexec/gcc/ /usr/libexec/gcc-4.8.5

ln -s /opt/rh/devtoolset-8/root/usr/libexec/gcc /usr/libexec/gcc

四、boost安装

如果是linux系统,先网上搜索直接通过yum或是apt-get安装吧,简单快捷,第一次可以这么直接安装一个版本,后面要安装新版本的,就还是源码来,也挺简单的。

首先上boost的官网,历史版本,下载系统对应的压缩包。

​ 一个注意点,有的cmake版本比较低的话,其自带的FindBoost.cmake里面可以看到支持的Boost版本可能不支持最新的,可能就需要安装低一点的版本。

​ 1.75还有1.78这种版本里面是有*.cmake文件的,然后我下载的1.65是没有*.cmake文件的,所以老版本就写进/etc/profile.d/Boost.sh文件里,新版本就直接在~/.bashrc里面export Boost_DIR变量。

# cmake笔记中有更细的内容
set(Boost_DIR /opt/boost_1_76_0/install/lib/cmake/Boost-1.76.0)
find_package(Boost 1.16.1 REQUIRED COMPONENTS filesystem system)

4.1 linux

使用:也大多为cmake调用,BoostConfig.cmake文件所在路径/opt/boost_1_76_0/install/lib/cmake/Boost-1.76.0/,直接在CMakeLists.txt中set指定此路径就好了,语句为:

set(Boost_DIR /opt/boost_1_76_0/my_install/lib/cmake/Boost-1.76.0/)

更好的方式是直接添加环境变量:

vim ~/.bashrc export Boost_DIR=/opt/boost/boost_1_78_0/my_install/lib/cmake/Boost-1.78.0 source ~/.bashrc

以下tips仅供参考,(没有CmakeLists.txt这么用吧),

Tips:网上还有建议说,为了方便使用,直接自动获取,而不通过set指定,就需要添加环境变量(这就比较建议新一个新文件vim /etc/profile.d/Boost.sh,然后把西面的内容放进去):(==这个很实用,特别是一些自库用自带的Makefiles构建的时候,设置了的类似于Boost_DIR对它是不管用的,需要以下面的方式去指定头文件路径==)

boost_dir=/opt/boost_1_76_0/my_install

export CPLUS_INCLUDE_PATH=${boost_dir}/include:$CPLUS_INCLUDE_PATH # 这应该是c++程序的头文件搜索路径

export LIBRARY_PATH=${boost_dir}/lib:$LIBRARY_PATH # 这应该是静态库地址

export LD_LIBRARY_PATH=${boost_dir}/lib:$LD_LIBRARY_PATH # 后面这个就是动态库的路径

它的cmake文件是:BoostConfig.cmake

4.2 Windows

假定其版本是1.76.0,解压后会得到boost_1_76_0这样的文件

使用:我主要是cmake的调用,其BoostConfig.cmake文件所在的路径大致为your_path\boost_1_76_0\stage\lib\cmake\Boost-1.76.0

特别注意:==这是vs的版本,只能给vs使用,在win下使用cmake生成mingw的项目,调用这个是不行的==。

Tips(以下tips仅供参考,我并未使用验证过,):在安装结束后,一般会有一个提示,如下:

==好像Boost的.cmake文件不是很好用,设定了一样会报错,就直接这样把头文件、库文件搜索路径添加进去就好了==。


以上是安装vs的版本,直接powershell安装的话,它默认就是安装的MSVC版本(这点不是很确定),如果我们需要其它版本,比如MinGW的话,很上面的操作类似:

五、protobuf安装

谷歌的protobuf,主要用于结构化数据的序列化和反序列化,应该也是可以直接使用yum、apt-get安装,也可以下面的源码。

c++主要是使用PROTOBUF_GENERATE_CPP()函数

下载地址:这里

就可以使用cmake了吧(直接用命令往里添加),当然也可以直接配置到环境变量,建议看这里

有关Protobuf的一个错误:

​ cmake的时候可能会出现这样的错误:Could NOT find Protobuf (missing: Protobuf_LIBRARIES Protobuf_INCLUDE_DIR),在CMakeLists.txt中应该也会找到一行类似:find_package(Protobuf REQUIRED),那这种错误就是缺乏相应的依赖,解决办法:

​ Ps:在搜索出来的结果里可以看到从依赖后面会有解释,说明该依赖是c++的头文件及函数库。

六、Gstream安装

​ gstreamer官方地址,然后它下载的源码应该是.tar.xz格式的,需要先使用xz命令做一下解压xz -d gstreamer-1.19.3.tar.xz(直接使用tar -Jxvf .tar.xz就行了)。这是官方demo地址

​ 然后这个版本问题,我试了1.15版本就还是用的configure,然后1.18以及1.19都是用的meson.build来构建的。

6.1 windows

安装:

使用:

6.2 ubuntu

6.3 centos

直接运行如下命令:

yum install gstreamer1 gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-plugins-bad-free gstreamer1-plugins-ugly-free gstreamer1-rtsp-server gstreamer1-svt-av1 json-glib openssl libuuid gstreamer1-plugins-base-devel json-glib-devel opencv-devel jansson-devel openssl-devel libuuid-devel gcc -y

说明:这是安装deepstreamer之前必要的环境(其实这安装完后,理论上是可以直接运行deepstreamer的demo的)。当然这样做后,也是可以直接运行通过gstreamer的demo的。

6.4 源码编译

​ 尽量不要自己源码编译了,始终有问题,这之所以还写,就是里面的编译发方法,以后应该还会遇到,涉及到直接使用./configure以及meson.build,所以放这了解:

​ gstreamer不同的版本,有两种方式:一种是里面有可执行文件./configure用它来配置的,另外一种是用python的项目meson(一般要python3.5以上)来构建的。

首先安装依赖:

以上这两个是必须的,没有的话,./configure都过不去

==方式一==:configure

meson & ninja

==方式二==:meson(这里有meson.build文件,小说明

环境配置:这两种方式都需要配置pkgconfig环境,按照上面opencv的来。

写入:export PKG_CONFIG_PATH=/opt/install/lib64/pkgconfig:$PKG_CONFIG_PATH # 前面是安装路径

然后: source /etc/profile

写入:/opt/install/lib64

然后:ldconfig

官方demo,建议使用官方的例子2:

​ 写一个basic-tutorial-2.c文件(注意一定是要.c,特别是在vs中)来测试,内容如下:(之所以要.c用c语言编译,是因为第38行。若改成msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, static_cast<GstMessageType>(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));就可以使用c++了,因为c++这里不能自动转换类型,要手动转换,而C可以)

#include <stdio.h>
#include <gst/gst.h>
int main(int argc, char *argv[]) {
	printf("hello world! \n");
	GstElement *pipeline, *source, *sink;
	GstBus *bus;
	GstMessage *msg;
	GstStateChangeReturn ret;
	/* Initialize GStreamer */
	gst_init(&argc, &argv);
	/* Create the elements */
	source = gst_element_factory_make("videotestsrc", "source");
	sink = gst_element_factory_make("autovideosink", "sink");
	/* Create the empty pipeline */
	pipeline = gst_pipeline_new("test-pipeline");
	if (!pipeline || !source || !sink) {
		g_printerr("Not all elements could be created.\n");
		return -1;
	}
	/* Build the pipeline */
	gst_bin_add_many(GST_BIN(pipeline), source, sink, NULL);
	if (gst_element_link(source, sink) != TRUE) {
		g_printerr("Elements could not be linked.\n");
		gst_object_unref(pipeline);
		return -1;
	}
	/* Modify the source's properties */
	g_object_set(source, "pattern", 0, NULL);
	/* Start playing */
	ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
	if (ret == GST_STATE_CHANGE_FAILURE) {
		g_printerr("Unable to set the pipeline to the playing state.\n");
		gst_object_unref(pipeline);
		return -1;
	}
	/* Wait until error or EOS */
	bus = gst_element_get_bus(pipeline);
	msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
	/* Parse message */
	if (msg != NULL) {
		GError *err;
		gchar *debug_info;
		switch (GST_MESSAGE_TYPE(msg)) {
		case GST_MESSAGE_ERROR:
			gst_message_parse_error(msg, &err, &debug_info);
			g_printerr("Error received from element %s: %s\n",
				GST_OBJECT_NAME(msg->src), err->message);
			g_printerr("Debugging information: %s\n",
				debug_info ? debug_info : "none");
			g_clear_error(&err);
			g_free(debug_info);
			break;
		case GST_MESSAGE_EOS:
			g_print("End-Of-Stream reached.\n");
			break;
		default:
			/* We should not reach here because we only asked for ERRORs and EOS */
			g_printerr("Unexpected message received.\n");
			break;
		}
		gst_message_unref(msg);
	}
	/* Free resources */
	gst_object_unref(bus);
	gst_element_set_state(pipeline, GST_STATE_NULL);
	gst_object_unref(pipeline);
	return 0;
}

g_object_set(source, “pattern”, 0, NULL); // 还有其它图案可以查看,把0改成其它数字,具体有(此页面的最底部)。


再来一个简单的流的播放例子demo:

#include <gst/gst.h>

int main(int argc, char* argv[]) {
	GstElement *pipeline;
	GstBus *bus;
	GstMessage *msg;

	/* Initialize */
	gst_init(&argc, &argv);

	/* Build */
	pipeline = gst_parse_launch("playbin uri=rtsp://192.168.108.11:554/user=admin&password=&channel=1&stream=1.sdp?", NULL);

	/* start playing */
	gst_element_set_state(pipeline, GST_STATE_PLAYING);

	/* Wait ubtil error or EOS */
	bus = gst_element_get_bus(pipeline);
	msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
    // 这行代码这样改,就可以用g++编译了:
	// msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, static_cast<GstMessageType>(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

	/*  */
	if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR) {
		g_error("An error occurred! Re-run with the GST_DEBUG=*:WARN environment variable set for more details.");
	}

	/* free resources */
	gst_message_unref(msg);
	gst_object_unref(bus);
	gst_element_set_state(pipeline, GST_STATE_NULL);
	gst_object_unref(pipeline);
	return 0;
}

编译:

Tips:

然后官方例子1basic-tutorial-1.c的内容,要注意uri对于网络视频地址和本地视频文件之间不同的写法: // 这是播放网络资源 pipeline = gst_parse_launch(“playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm”,NULL);

// 这是播放本地视频,file后面两个斜杠,后面是绝对路径 // pipeline = gst_parse_launch(“playbin uri=file:///home/sh/Desktop/sintel_trailer-480p.webm”,NULL); // windows上的写法是,file:/// 注意是三个斜杠 // pipeline = gst_parse_launch(“playbin uri=file:///C:/Users/Administrator/Videos/sintel_trailer-480p.webm”, NULL);


命令行拉流:gst-launch-1.0 playbin uri=”rtsp://192.168.108.11:554/user=admin&password=&channel=1&stream=1.sdp?” # 感觉无论是命令行还是代码,延迟都很大啊

七、FFmpeg安装

结合自己写的博客看吧。(还有一定注意版本3、4有些不一样,在ffmpeg读流展示那里有写)

​ 备注:自己在centos上编译的,bin里面的命令工具可以直接使用,但是可能因为编译时一些开关没有设置好,用include、lib做代码开发的时候有些问题,所以直接用github上编译好的包吧(带shared的才是有头文件、库文件的)。这里也是预编译好的

说一下,现在大版本3构建的会有ffserver(它的使用可以参考一下这里,但不是很好用,官方都移除了,还是用srs吧),然后在版本4里面已经被移除了;

八、vulkan安装

vulkan与OpenGL的区别,这里。vulkan主要是想来取代OpenGL。

前面主要尝试了两种:

​ 一种是直接安装vulkan软件,直接使用里面的lib库,然后把路径添加到vs中,进行编译使用,教程在这里,比较简单。

​ 另一种是github上的一个关于vulkan的完整demo,它把需要用到的三方库都包含进来了,直接按其官方教程进行cmake配置好(注意指定为win64,不然好像是默认的win32,后面vs编译时就会出错),vs打开编译就好了。下面简单写下过程,以作参考:

九、vcg

vcg库是在编译openMVS时是要的,它也是opneMVS的作者开源的,好像是head-only。

安装: