首页 > 其他分享 >OpenCV 基本使用

OpenCV 基本使用

时间:2024-08-09 09:17:51浏览次数:14  
标签:基本 编译 rosnoetic imageBasics OpenCV build 使用 VirtualBox

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 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的依赖项很多,缺少某些编译项会影响它的部分功能。OpenCVcmake阶段检查依赖项是否会安装,并调整自己的功能。如果电脑上有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 ..

  • cmake 过程

接着进行编译

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

整个编译过程大概需要二十分钟到一小时不等。

  • make 过程

make之后,调用sudo make installOpenCV安装到电脑上(而不是仅仅编译)。

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

  • make install 过程

2. 操作 OpenCV 图像

2.1 编写 imageBasics 函数

2.1.1 创建文件夹

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

rosnoetic@rosnoetic-VirtualBox:~$ mkdir -p imageBasics

rosnoetic@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指针指向待访问的像素数据
            // 输出该像素的每个通道,如果是灰度图,那么通道是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;
}

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 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

2.4 运行

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

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

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

依次显示如下内容:

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

标签:基本,编译,rosnoetic,imageBasics,OpenCV,build,使用,VirtualBox
From: https://www.cnblogs.com/windandchimes/p/18350134

相关文章

  • 使用Python和Flask框架实现简单的RESTful API
    目录环境准备创建Flask应用运行Flask应用测试API注意事项在当今的Web开发领域,RESTfulAPI因其简洁性和高效性而备受欢迎。本文将引导你使用Python的Flask框架来创建一个简单的RESTfulAPI,用于增删改查(CRUD)用户信息。环境准备在开始之前,请确保你的Python环境中已经安......
  • 如何使用 beautifulsoup4 选择部分 HTML 标签进行网页抓取
    这是我试图从中抓取数据的网站的链接:https://www.fotmob.com/leagues/47/stats/season/20720/players/goals/premier-league我想使用beautifulsoup4选择class='css-653rx1-StatsContainereozqs6r5'的部分。在您提到find()和find_all()之前,我已经使用了两......
  • 如何使用字典更改张量中的值?
    当我有如下的张量和字典时,如何将字典映射到张量?例如,Dict={1:'A',2:'B',3:'C'}ex=torch.tensor([[1,2,3],[3,2,1]])#Expectedresult#tensor([[A,B,C],#[C,B,A]])我尝试了这个代码和torch.where,但它不起作用出色地。......
  • 使用两个连接的字符串调用变量 Python
    抱歉缺乏细节,因为我是python的初学者:c1=c2=c3=c4=c5=Falsex=int(input("Enteranumber1-5:"))ifx>5orx<1:print("Yournumbermustbebetween1and5")else:"c",x=True第8行是连接2个字符串的地方。我不确定......
  • MybatisPlus的分页插件简单使用
    MyBatis-Plus提供了强大的分页插件,可以方便地实现数据库查询结果的分页。以下是关于MyBatis-Plus分页插件的详细介绍,包括如何配置和使用。1.添加依赖首先,需要在项目中添加MyBatis-Plus和分页插件的相关依赖。使用Maven,在pom.xml文件中添加:<dependency><groupId>......
  • vue中methods、mounted等的使用方法解析
    created:html加载完成之前,执行。执行顺序:父组件-子组件mounted:html加载完成后执行。执行顺序:子组件-父组件methods:事件方法执行watch:去监听一个值的变化,然后执行相对应的函数computed:computed是计算属性,也就是依赖其它的属性计算所得出最后的值 vue中localstorage用法......
  • 【Playwright+Python】系列教程(八)鉴权Authentication的使用
    写在前面还是有些絮叨的感觉,官方翻译和某些博主写那个玩楞,基本都是软件直接翻译后的产物。读起来生硬不说,甚至有的时候不到是什么意思,真的是实在不敢恭维。到底是什么意思?就是你已经登陆过一次,在Session、Cookie未失效的情况下,登录过一次后,下次就不用再走一遍登录的过程,从而缩......
  • Charles使用教程
     一、Charles教程(一)Charles使用教程Charles是一个HTTP代理/HTTP监视器/反向代理,能够查看其机器和Internet之间的所有HTTP和SSL/HTTPS流量。这包括请求,响应和HTTP标头(包含cookie和缓存信息)Charles是在Mac/Windows下常用的网络封包截取工具,在做移动开发时,我们为了调试......
  • OpenCV专栏介绍
    在当今人工智能和计算机视觉领域,OpenCV作为一个功能强大的开源库,已经成为实现各种视觉算法的基石。本“OpenCV”专栏致力于帮助读者深入理解并掌握OpenCV的使用,从而在计算机视觉项目中发挥关键作用。专栏导读随着技术的不断进步,计算机视觉在自动驾驶、人脸识别、图像处理......
  • 【思考模型框架】使用遗憾最小化框架(Regret Minimization Framework),帮助决策者以一种
    一、遗憾最小化框架的定义遗憾最小化框架,是一种决策理论。遗憾最小化框架,是一种决策制定策略。遗憾最小化框架,是一种实用的决策工具。遗憾最小化框架,RegretMinimizationFramework。遗憾最小化框架,尤其在高度不确定的环境中,它可以帮助决策者以一种系统化的方式减少未......