当前位置: 首页 > news >正文

OpenCV 基本使用

OpenCV 基本使用

参考教程:

GitHub - gaoxiang12/slambook2: edition 2 of the slambook

1. 安装 OpenCV

1.1 下载 OpenCV

参考教程:

无法定位软件包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系列。

从如下网站中下载源代码:

Releases - OpenCV

页面下滑,选择OpenCV – 3.4.16版本,点击”Sources“进行下载

下载得到如下的压缩包

opencv-3.4.16.zip文件拖拽至虚拟机的home文件夹下:

点击opencv-3.4.16.zip文件,右键,选择“提取到此处

1.2 配置依赖项并编译

编译之前,先来安装OpenCV的依赖项:

rosnoetic@rosnoetic-VirtualBox:~$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"rosnoetic@rosnoetic-VirtualBox:~$ sudo apt updaterosnoetic@rosnoetic-VirtualBox:~$ sudo apt upgraderosnoetic@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的依赖项很多,缺少某些编译项会影响它的部分功能。OpenCVcmake阶段检查依赖项是否会安装,并调整自己的功能。如果电脑上有GPU并且安装了相关依赖项,OpenCV也会把GPU加速打开。不过当前,上述依赖项已经足够了。

安装完依赖项后进行编译:

rosnoetic@rosnoetic-VirtualBox:~$ cd opencv-3.4.16/rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16$ mkdir buildrosnoetic@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 installOpenCV安装到电脑上(而不是仅仅编译)。

rosnoetic@rosnoetic-VirtualBox:~/opencv-3.4.16/build$ sudo make install

2. 操作 OpenCV 图像

2.1 编写 imageBasics 函数

2.1.1 创建文件夹

通过终端创建一个名为imageBasics的文件夹以保存我们的VSCode项目,在/imageBasics目录下打开vscode

rosnoetic@rosnoetic-VirtualBox:~$ mkdir -p imageBasicsrosnoetic@rosnoetic-VirtualBox:~$ cd imageBasics/rosnoetic@rosnoetic-VirtualBox:~/imageBasics$ code .

2.1.2 编写源代码

新建文件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指针指向待访问的像素数据// 输出该像素的每个通道,如果是灰度图,那么通道是1for (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的块置为0cv::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;
}

2.2 新建 CMakeLists.txt 文件

新建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标准(如nullptrchrono),因此需要设置编译器set(CMAKE_CXX_FLAGS "-std=c++11")

2.3 cmake 编译

ctrl+alt+T打开终端,执行如下指令进行cmake编译

rosnoetic@rosnoetic-VirtualBox:~$ cd imageBasics/rosnoetic@rosnoetic-VirtualBox:~/imageBasics$ mkdir buildrosnoetic@rosnoetic-VirtualBox:~/imageBasics$ cd build/rosnoetic@rosnoetic-VirtualBox:~/imageBasics/build$ cmake ..

我们新建了一个中间文件夹”build“,然后进入build文件夹,通过cmake ..命令对上一层文件夹,也就是代码所在的文件夹进行编译。这样,cmake产生的中间文件就会生成在build文件夹中,如下图所示,和源代码分开。

接着make对工程进行编译

rosnoetic@rosnoetic-VirtualBox:~/imageBasics/build$ make

2.4 运行

ubuntu.png文件拖拽至imageBasics/build文件夹下

进一步的调用可执行文件:

rosnoetic@rosnoetic-VirtualBox:~/imageBasics/build$ ./imageBasics ubuntu.png 

依次显示如下内容:

image窗口,按enter键执行下一个程序(也就是停留在了cv::waitKey()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 思科CCNP最新考证流程
  • 2024医疗器械网络交易服务第三方平台备案申请流程
  • 零基础学会机器学习,到底要多久?
  • Collection和List集合
  • C++中有哪几种构造函数?
  • 基于迅为RK3588开发板的AI图像识别方案
  • 如何让RStudio使用不同版本的R
  • 【python中级】串口发送ASCII字符以及十六进制字符
  • 算法【二分答案法】
  • 解锁多场景,EasyCVR视频汇聚网关赋能业务数字化转型
  • 系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理
  • Linux 初级面试题目-45题 总结
  • 插值算法在数学建模中的应用:以淡水养殖池塘数据为例
  • Android 手机恢复出厂设置后,还能恢复其中数据吗?
  • 8.3.数据库基础技术-关系代数
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【Linux系统编程】快速查找errno错误码信息
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • bearychat的java client
  • crontab执行失败的多种原因
  • JAVA SE 6 GC调优笔记
  • Java,console输出实时的转向GUI textbox
  • Joomla 2.x, 3.x useful code cheatsheet
  • JSONP原理
  • nodejs调试方法
  • npx命令介绍
  • php面试题 汇集2
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Vue实战(四)登录/注册页的实现
  • 测试开发系类之接口自动化测试
  • 仿天猫超市收藏抛物线动画工具库
  • 解决iview多表头动态更改列元素发生的错误
  • 解析带emoji和链接的聊天系统消息
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 区块链分支循环
  • 深入浏览器事件循环的本质
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信小程序:实现悬浮返回和分享按钮
  • 微信小程序设置上一页数据
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​补​充​经​纬​恒​润​一​面​
  • !!Dom4j 学习笔记
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ## 基础知识
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #QT 笔记一
  • (¥1011)-(一千零一拾一元整)输出
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (南京观海微电子)——示波器使用介绍