赞
踩
参考教程:
GitHub - gaoxiang12/slambook2: edition 2 of the slambook
参考教程:
无法定位软件包libjasper-dev的解决办法-CSDN博客
视觉slam14讲ch5 opencv安装 ubuntu20.04_libvtk5-dev-CSDN博客
OpenCV
提供了大量的开源图像算法,是计算机视觉领域使用极广的图像处理算法库。在Ubuntu
系统下,OpenCV
有从源代码安装和只安装库文件两种方式可以选择:
(1)从源代码安装,是指从OpenCV
网站下载所有的OpenCV
源代码,并在机器上编译以便使用。好处是可以选择的版本比较丰富,而且也能看到源代码,不过需要花费一些编译时间。
(2)只安装库文件,是指通过Ubuntu
安装由Ubuntu
社区人员已经编译好的库文件,无须重新编译一遍。
因为我们使用较新版本的OpenCV
,所以必须选择从源代码安装的方式来安装它。一来,可以调整一些编译选项,匹配编程环境(例如,需不需要GPU加速等);再者,可以使用一些额外的功能。OpenCV
目前维护三个主要版本,分为OpenCV2.4
系列、OpenCV 3
系列和OpenCV 4
系列。当前使用OpenCV 3
系列。
从如下网站中下载源代码:
页面下滑,选择OpenCV – 3.4.16
版本,点击”Sources
“进行下载
下载得到如下的压缩包
将opencv-3.4.16.zip
文件拖拽至虚拟机的home
文件夹下:
点击opencv-3.4.16.zip
文件,右键,选择“提取到此处
”
编译之前,先来安装OpenCV
的依赖项:
rosnoetic@rosnoetic-VirtualBox:~$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
rosnoetic@rosnoetic-VirtualBox:~$ sudo apt update
rosnoetic@rosnoetic-VirtualBox:~$ sudo apt upgrade
rosnoetic@rosnoetic-VirtualBox:~$ sudo apt-get install build-essential libgtk2.0-dev libvtk6-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev libtbb-dev libcanberra-gtk-module
事实上,OpenCV
的依赖项很多,缺少某些编译项会影响它的部分功能。OpenCV
在cmake
阶段检查依赖项是否会安装,并调整自己的功能。如果电脑上有GPU
并且安装了相关依赖项,OpenCV
也会把GPU
加速打开。不过当前,上述依赖项已经足够了。
安装完依赖项后进行编译:
rosnoetic@rosnoetic-VirtualBox:~$ cd opencv-3.4.16/
rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16$ mkdir build
rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16$ cd build/
rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16/build$ cmake ..
接着进行编译
rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16/build$ make
整个编译过程大概需要二十分钟到一小时不等。
make
之后,调用sudo make install
将OpenCV
安装到电脑上(而不是仅仅编译)。
rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16/build$ sudo make install
通过终端创建一个名为imageBasics
的文件夹以保存我们的VSCode
项目,在/imageBasics
目录下打开vscode
。
rosnoetic@rosnoetic-VirtualBox:~$ mkdir -p imageBasics
rosnoetic@rosnoetic-VirtualBox:~$ cd imageBasics/
rosnoetic@rosnoetic-VirtualBox:~/imageBasics$ code .
新建文件imageBasics.cpp
在imageBasics.cpp
粘贴如下代码并保存(Ctrl+S)
#include <iostream> #include <chrono> using namespace std; #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> int main(int argc, char argv) { // 读取argv[1]指定的图像 cv::Mat image; //cv::image函数读取制定路径下的图像 image = cv::imread(argv[1]); // 判断图像文件是否正确读取 if (image.data == nullptr) { // 数据不存在,可能是文件不存在 cerr << "文件" << argv[1] << "不存在" <<endl; return 0; } // 文件顺利读取,首先输出一些基本信息 cout << "图像宽为: " << image.cols << ",高为: " << image.rows << ",通道数为" << image.channels() << endl; cv::imshow("image",image); // cv::imshow显示图像 cv::waitKey(0); // 暂停程序,等待一个按键输入 // 判断imgae的类型 if (image.type() != CV_8UC1 && image.type() != CV_8UC3) { // 图像类型不符合要求 cout << "请输入一张彩色图或灰度图" << endl; return 0; } // 遍历图像,请注意以下遍历方式也使用于随机像素访问 // 使用std::chrono给算法计时 chrono::steady_clock::time_point t1 = chrono::steady_clock::now(); for (size_t y = 0; y < image.rows; y++) { // 用cv::Mat::ptr获得图像的行指针,<unsigned char>指定类型,(y)是一个索引值,表示我们要访问的行数 unsigned char *row_ptr = image.ptr<unsigned char>(y); for (size_t x = 0; x < image.cols; x++) { // 访问位于x,y处的像素 unsigned char *data_ptr = &row_ptr[x * image.channels()]; // data_ptr指针指向待访问的像素数据 // 输出该像素的每个通道,如果是灰度图,那么通道是1 for (int c = 0; c != image.channels(); c++) { unsigned char data = data_ptr[c]; // data为I(x,y)第c个通道的像素值 } } } chrono::steady_clock::time_point t2 = chrono::steady_clock::now(); // 计算消耗时间 chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>> (t2-t1); cout << "遍历图所用时间: " << time_used.count() << "秒。"<< endl; // 关于cv::Mat的拷贝 // 直接赋值并不会拷贝数据 cv::Mat image_another = image; // 此时修改image_another,会导致image发生变化 image_another(cv::Rect(0, 0, 100, 100)).setTo(0); // 将左上角100*100的块置为0 cv::imshow("image",image); cv::waitKey(0); // 使用clone深拷贝复制数据 cv::Mat image_clone = image.clone(); image(cv::Rect(0, 0, 100, 100)).setTo(255); cv::imshow("image", image); cv::imshow("image_clone", image_clone); cv::waitKey(0); // 删除所有的窗口 cv::destroyAllWindows(); return 0; }
新建CMakeLists.txt
文件
在CMakeLists.txt
中添加如下内容:
# 声明要求的cmake最低版本 cmake_minimum_required(VERSION 2.8) # 声明一个cmake工程 project(IMAGEBASICS) # 添加C++ 11支持 set(CMAKE_CXX_FLAGS "-std=c++11") # 寻找OpenCV库 find_package( OpenCV REQUIRED) # 添加头文件 include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(imageBasics imageBasics.cpp) # 链接OpenCV库 target_link_libraries(imageBasics ${OpenCV_LIBS})
由于程序中使用了C++11
标准(如nullptr
和chrono
),因此需要设置编译器set(CMAKE_CXX_FLAGS "-std=c++11")
。
ctrl+alt+T
打开终端,执行如下指令进行cmake
编译
rosnoetic@rosnoetic-VirtualBox:~$ cd imageBasics/
rosnoetic@rosnoetic-VirtualBox:~/imageBasics$ mkdir build
rosnoetic@rosnoetic-VirtualBox:~/imageBasics$ cd build/
rosnoetic@rosnoetic-VirtualBox:~/imageBasics/build$ cmake ..
我们新建了一个中间文件夹”build
“,然后进入build
文件夹,通过cmake ..
命令对上一层文件夹,也就是代码所在的文件夹进行编译。这样,cmake
产生的中间文件就会生成在build
文件夹中,如下图所示,和源代码分开。
接着make
对工程进行编译
rosnoetic@rosnoetic-VirtualBox:~/imageBasics/build$ make
将ubuntu.png
文件拖拽至imageBasics/build
文件夹下
进一步的调用可执行文件:
rosnoetic@rosnoetic-VirtualBox:~/imageBasics/build$ ./imageBasics ubuntu.png
依次显示如下内容:
在image
窗口,按enter键执行下一个程序(也就是停留在了cv::waitKey()
)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。