技术标签: ubuntu 计算机视觉 opencv学习笔记 opencv
sudo apt-get install make
安装cmake可以参考我的博客https://blog.csdn.net/weixin_44698673/article/details/125964197?spm=1001.2014.3001.5502
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libcanberra-gtk-module
sudo apt-get install pkg-config
下载地址:https://opencv.org/releases/
点击sources下载源码,我下载的4.5.4的源码。
将下载完成的源码解压到ubuntu中。
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..
等待编译完成之后执行make
sudo make
开始编译代码,大概需要1-2个小时
代码编译完成之后
sudo make install
打开文件 /etc/ld.so.conf,在最后一行加上 /usr/local/lib
注解:/etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so库的路径。
默认情况下,编译器只会使用/lib和 /usr/lib 这两个目录下的库文件,而通常通过源码包进行安装时,如果不指定 --prefix会将库安装在 /usr/local 目录下,而又没有在件/etc/ld.so.conf中添加/usr/local/lib这个目录>。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。
对于此种情况有2种解决办法:
1)在用源码安装时,用–prefix指定安装路径为/usr/lib。这样的话也就不用配置PKG_CONFIG_PATH
2) 直接将路径/usr/local/lib路径加入到文件/etc/ld.so.conf文件的中。在文件/etc/ld.so.conf中末尾直接添加:/usr/local/lib
ldconfig
再来看看ldconfig这个程序,位于/sbin下,它的作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新的搜索路径,需要运>行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。
PKG_CONFIG_PATH:
最后说下PKG_CONFIG_PATH这个环境变量,它是在安装了pkg-config后出现的
其实pkg-config就是向configure程序提供系统信息的程序,比如软件的版本啦,库的版本啦,库的路径
PKG_CONFIG_PATH 指明 *.pc 文件(包配置文件,保存了库的头文件,库所在的路径信息比如编译某个工程用到glib-2.0这个库,pkg-config会按照PKG_CONFIG_PATH中的路径行搜索glib-2.0.pc,然后把lib-2.0.pc作为参数传给GCC,那么GCC就可以找到该库了)的路径。
如:PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig
WC 一下偏离主题这么远,回归主题配置环境变量
sudo gedit /etc/ld.so.conf
在文件中加上一行 /usr/local/lib,因为makefile中默认opencv安装在该路径下。
运行ldconfig,使添加的库路径生效
sudo ldconfig
修改bash.bashrc
sudo gedit /etc/bash.bashrc
在文件末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
运行该脚本 生效新设的环境变量
source /etc/bash.bashrc
在命令行中输入如下命令,检测opencv是否安装成功
pkg-config opencv --modversion
表示 opencv安装成功。(这里有一个疑问 我明明下载的4.5.4的源码 为什么这里显示版本为3.2.0,有没有路过的老铁能给解答一下)
如果没有opencv.pc,那么就手动创建它
cd /usr/local/lib/pkgconfig
touch opencv.pc
sudo gedit opencv.pc
文件内容
prefix=/usr/local
exec_prefix=${prefix}
includedir=/usr/local/include
libdir=/usr/local/lib
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.4.0
Libs: -L${exec_prefix}/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}
创建一个test.cpp,源码如下
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv )
{
Mat image = imread("123.jpg");
namedWindow("SSJ",WINDOW_FREERATIO);
imshow("SSJ", image);
waitKey(0);
return 0;
}
编译
g++ test.cpp -o test.out $(pkg-config --cflags --libs opencv)
注解:pkg-config 是前文中已经安装的程序,一个包管理工具,可以用于获得某一个库/模块的所有编译相关的信息,pkg-config --cflags --libs opencv 将opencv包的头文件和库信息传递给编译器。不需要再手动去指定头文件和库路径
g++ test.cpp -o test.out -I /usr/include/opencv2 -l /usr/local/lib/opencv
–libs,查看库信息。
–cflags,查看头文件信息。
pkg-config的信息来自 (1) 系统的/usr/lib下的所有 .pc文件。 (2)
PKG_CONFIG_PATH环境变量所指向的路径下的所有.pc文件。
运行程序
./test.out
安装成功!!!
老铁如果有收获 就给个赞吧
前言因为需要视频录制和截图,所以编译了一下VLC,做下记录;该版本已经提供了视频录制接口,需要新增截图功能特别注意:如果需要视频录制和截图,需要关闭硬件解码media.setHWDecoderEnabled(false, false);前篇如何编译VLC时间2019-05-11开始主要讲的是思路,结果很简单;1、根据Vlc 提供MediaPlayer类...
NOIP初赛 CSP-J1 CSP-S1 第1轮 初赛 信奥中的数学知识(一)NOIP初赛 CSP-J1 CSP-S1 第1轮 初赛 信奥中的数学知识(一)-程序员宅基地NOIP初赛 CSP-J1 CSP-S1 第1轮 初赛 信奥中的数学知识(二)NOIP初赛 CSP-J1 CSP-S1 第1轮 初赛 信奥中的数学知识(二)_dllglvzhenfeng的博客-程序员宅基地NOIP初赛 CSP-J1 CSP-S1 第1轮 初赛 信奥中的数学知识(三)NOIP初赛 CSP
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请选择你喜欢的花" android:layout_gravity="center" android:textSize="50dp" and...
过滤标点符号: win8特殊符号怎么打 WIN8标点符号怎么打?,缺失:python过滤标点符号13006/11以下是的一些我们精选的win8特殊符号怎么打 WIN8标点符号怎么打?许多人当系统升级到WIN8后,一些特殊的符号就不会打了,小编在网上收集了一些资料,整理出来,献给大家。win8特殊符号怎么打【一】、软键盘:键盘上有的标点符号就不用说了,直接打出来。键盘上没有的一些特殊符号其实可以调用...
前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者:merlin&操作环境Python版本: anaconda3 python3.7.4操作系统: Ubuntu19.10编译器: pycharm社区版用到的模块: pyttsx3,requestspysstx3模块介绍pyttsx3(Text to Speech)是一个语音转换模块,它可以在离线的环境下工作,支持多个引擎,而且兼容于Python2和Pyt
学前必读本教程面向人群小白,但不是纯小白(至少你得会安装软件,会用百度)有一门编程语言基础的程序员。本教程特点简洁,每节课控制在10分钟左右,不讲废话,但是需要你看完之后去主动学习(下文会提到主动学习)通俗易懂,尽量少的出现晦涩难懂的专业名词,尽可能用生活中常见的事物去形象地打比方。本教程功能入门python,仅仅是入门,吃瓜群众:...
Have you ever wondered what “XP” stands for or where “Ubuntu” comes from? Some operating systems get their names from obvious places, but others need some explaining. Read on to find out where your fa...
开发web的两种方式基于OSGI开发B/S应用有两种方式:1)在OSGI框架中嵌入Http服务器2)在Servlet容器中嵌入OSGI框架Http服务器嵌入到OSGI框架环境配置配置运行环境,选择Run->Run Configuration,new一个环境保留以下几个Bundle,包括javax.servlet、org.apa...
wordpress简捷按钮Do you want to add a click-to-call button in WordPress? As more people visit your website using their smart phones, adding a tap-to-call button makes it easy for them to contact you. In t...
在工作学习过程中,有不少时候会遇到需要使用已有的工程或者源代码,有时候会碰到这样一种情况,你的VS版本比原有项目的版本低,这样直接运行肯定会报错的,你需要做如下修改:1、右键打开.sln文件,然后按照图中所标对照自己的VS版本进行修改,因为我用的是vs2012,所以作如图所示修改:2、右击打开项目中的Demo.vcxproj文件,修改tool的版本,vs2012是4,其他的vs根据
答案在这里 https://www.nowcoder.com/questionTerminal/60594521f1db4d75ad78266b0b35cfbb ,将最大和最小值配对即可证明如何证明这个做法正确呢?用反证法和递推法即可。首先,假设数组中有数字a,b,c,d,其中a是数组中最小的数,d是数组中最大的数,b与c是中间的两个数字。并且有a < b < c < d。c和b不必要是第二大/小的数字现在,我们看向数组中最大的数字d。我们认为,当进行(a, d)、(b,c)
一、基本语法:nvl 函数:nvl 函数的基本语法为 nvl(E1, E2),如果E1为 NULL,则函数返回E2,否则返回E1本身。但此函数有一定局限,所以就有了nvl2函数。如果两个参数的值都为空值,则返回空值。注意:第一个参数和第二个参数可以是任何类型的数据,但两个参数的数据类型必须相同(或能够由Oracle隐式转换为相同的类型)nvl2 函数:nvl2 函数的基本语法为 n...