C++ opencv操作入门教程

这篇具有很好参考价值的文章主要介绍了C++ opencv操作入门教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

OpenCV是一个功能强大的计算机视觉库,广泛应用于图像和视频处理领域。它提供了许多图像和视频处理的函数和工具,包括加载、保存、缩放、旋转、裁剪、滤波、特征检测、跟踪、分割等等。本文将介绍一些常见的OpenCV函数及其作用,适合初学者入门。

基本数据类型

  • cv::Mat:代表一个n维矩阵,是OpenCV中最常用的数据类型之一。
  • cv::Point、cv::Point2f、cv::Point3f:代表一个二维或三维的点。
  • cv::Size、cv::Size2f:代表一个二维大小。
  • cv::Rect、cv::Rect2f:代表一个矩形。
  • cv::Scalar:代表一个包含4个double类型元素的向量。
  • cv::Vec:代表包含固定数量元素的向量,例如cv::Vec3b表示一个3元素的向量,每个元素都是一个unsigned char类型。
  • cv::Mat_< T>:代表一个n维矩阵,其中T是一个基本数据类型,例如cv::Mat_ < double > 代表一个元素类型为double的矩阵。

图像处理数据类型cv::Mat

当我们使用 OpenCV 进行图像处理时,我们通常会使用 cv::Mat 类型来表示图像。cv::Mat 是一个多维数组(矩阵)类型,可以存储不同类型的数据。它的设计旨在提供一个通用的数据容器,使得可以方便地在图像处理和计算机视觉应用中使用。

以下是 cv::Mat 的常用构造函数:

cv::Mat(); // 构造一个空的矩阵
cv::Mat(int rows, int cols, int type); // 构造一个指定行列和类型的矩阵
cv::Mat(cv::Size size, int type); // 构造一个指定大小和类型的矩阵
cv::Mat(int rows, int cols, int type, const void* data, size_t step = AUTO_STEP); // 构造一个从给定数据构造矩阵的方法

其中,参数含义如下:

rows:矩阵的行数;
cols:矩阵的列数;
type:矩阵的数据类型;
size:矩阵的大小;
data:指向矩阵数据的指针;
step:矩阵每行的字节数,如果未指定,则根据 cols 和 type 自动计算。

常见函数

读取图像函数cv::imread

函数原型:

cv::Mat cv::imread(const string& filename, int flags = cv::IMREAD_COLOR)

作用:从文件中读取图像

参数说明:
filename:图像文件名
flags:读取图像的方式,
默认为cv::IMREAD_COLOR,即读取彩色图像;
还可以是cv::IMREAD_GRAYSCALE,读取灰度图像;
或者cv::IMREAD_UNCHANGED,读取原始图像。

示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    // 读取图像
    Mat image = imread("lena.jpg", IMREAD_COLOR);

    // 判断是否读取成功
    if (image.empty())
    {
        cout << "Could not open or find the image" << endl;
        return -1;
    }

    // 显示图像
    imshow("Image", image);

    // 等待按键
    waitKey(0);

    return 0;
}

显示图像cv::imshow

函数原型:

void cv::imshow(const string& winname, InputArray mat)

作用:在窗口中显示图像

参数说明:
winname:窗口名称
mat:要显示的图像
示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    // 读取图像
    Mat image = imread("lena.jpg", IMREAD_COLOR);

    // 判断是否读取成功
    if (image.empty())
    {
        cout << "Could not open or find the image" << endl;
        return -1;
    }

    // 显示图像
    imshow("Image", image);

    // 等待按键
    waitKey(0);

    return 0;
}

颜色空间转换函数cv::cvtColor

函数原型:

void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)

作用:cv::cvtColor 函数是 OpenCV 中用于颜色空间转换的函数,它的作用是将输入的图像从一个颜色空间转换为另一个颜色空间。常见的颜色空间包括 RGB、BGR、HSV、YUV 等。

参数说明:

src:源图像
dst:目标图像
code:颜色空间转换代码,例如cv::COLOR_BGR2GRAY表示将BGR图像转换为灰度图像
dstCn:目标图像的通道数,如果为0,则与源图像的通道数相同
(目标图像的通道数指的是每个像素包含的颜色通道数,通常表示为“channels”。例如,灰度图像只有一个颜色通道,因此其通道数为1;而RGB图像有红、绿、蓝三个颜色通道,因此其通道数为3。另外,还有一些其他的颜色空间,例如HSV、Lab等,它们的通道数也不同。)

示例代码:

视频读取和显示类型

除了读取和显示单张图片外,OpenCV还支持读取和显示视频。

cv::VideoCapture 是 OpenCV 中的一个类,使用cv::VideoCapture类可以打开一个视频文件,并逐帧读取其中的图像。使用cv::VideoWriter类可以将一系列图像写入到一个视频文件中。

还可以用于捕获视频和摄像头的实时视频流。通过该类,可以轻松地从本地视频文件或相机捕获视频流,并进行处理或分析。

使用 cv::VideoCapture 类时,需要指定视频源的索引号或文件名,以及对应的参数(如视频宽高、帧率等)。然后,就可以使用类中的方法逐帧捕获视频帧,并进行相应的处理。

常见的使用方式包括从本地视频文件中读取视频,如:

cv::VideoCapture cap("video.avi");

或者从摄像头中实时获取视频流,如:

cv::VideoCapture cap(0);

在实际应用中,可以利用 cv::VideoCapture 来实现视频分析、视频处理等功能,如目标检测、人脸识别、车道检测等。

示例代码1:读取视频并显示其中的帧

下面是一个简单的示例,演示了如何读取视频并显示其中的帧:

#include <opencv2/opencv.hpp>

int main() {
    cv::VideoCapture cap("video.mp4");
    if (!cap.isOpened()) {
        std::cerr << "Failed to open video file" << std::endl;
        return -1;
    }

    cv::namedWindow("Video", cv::WINDOW_NORMAL);
    cv::Mat frame;
    while (cap.read(frame)) {
        if (frame.empty()) {
            break;
        }

        cv::imshow("Video", frame);
        if (cv::waitKey(25) == 27) {//cv::waitKey(25)是等待25毫秒并返回按键的ASCII码,如果没有按键被按下,则返回-1
            break;
        }
    }

    return 0;
}

在这个示例中,我们首先打开了一个名为“video.mp4”的视频文件,并创建了一个名为“Video”的窗口。然后使用cap.read(frame)逐帧读取视频,并将读取到的帧显示在窗口中。使用cv::waitKey(25)等待25毫秒,并检查是否有ESC键按下,如果有则退出循环。

示例代码2:从相机捕获视频流

可以通过cv::VideoCapture类从相机捕获视频流。下面是一个示例代码:

#include <opencv2/opencv.hpp>

int main()
{
    cv::VideoCapture cap(0); // 打开默认相机

    if (!cap.isOpened()) // 检查相机是否打开
    {
        std::cout << "Failed to open camera." << std::endl;
        return -1;
    }

    cv::Mat frame;
    while (true)
    {
        cap.read(frame); // 从相机中读取一帧图像

        cv::imshow("Camera", frame); // 显示图像
        if (cv::waitKey(30) == 27) // 按下ESC键退出
            break;
    }

    cap.release(); // 释放相机资源
    cv::destroyAllWindows(); // 关闭所有窗口

    return 0;
}

该程序打开默认相机,并从相机中连续读取帧图像,然后将其显示在窗口中。当按下ESC键时,程序退出并释放相机资源。注意,在使用相机之前,需要确保已经安装了正确的驱动程序,并且在程序中使用的相机设备索引号是正确的。

cv::imencode编码传输

cv::imencode是OpenCV库中的函数,其原型如下:


bool cv::imencode(const String& ext, InputArray img, std::vector<uchar>& buf, const std::vector<int>& params = std::vector<int>())

作用:cv::imencode函数用于将图像数据编码为特定格式(如JPEG、PNG等)的图像文件格式,并将结果存储在内存缓冲区中(由buf参数传入)。该函数可以将图像数据从OpenCV的数据结构(如cv::Mat)编码为指定格式的字节流,方便后续的存储、传输或处理(例如网络编程就常常使用它进行编码)。函数还可以通过params参数传递额外的编码参数,以调整编码过程中的参数设置。函数返回一个布尔值,表示编码是否成功。

总结

本文简单介绍了OpenCV中常用的图像处理函数和类,包括图像读取和保存、图像显示、视频读取和显示等。这些函数和类都是OpenCV图像处理的基础,掌握了这些基础知识后,我们就可以更加深入地研究和应用OpenCV了。文章来源地址https://www.toymoban.com/news/detail-578703.html

到了这里,关于C++ opencv操作入门教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV 入门教程:膨胀和腐蚀操作

    膨胀和腐蚀是图像处理中常用的形态学操作,用于改变图像的形状和结构。在 OpenCV 中,膨胀和腐蚀是基于结构元素的像素操作,可以用于图像增强、边缘检测、图像分割等多个领域。本文将以膨胀和腐蚀操作为中心,为你介绍使用 OpenCV 进行形态学操作的基本步骤和实例。

    2024年02月13日
    浏览(35)
  • C++入门教程,C++基础教程(第一部分:从C到C++)七

    由C语言发展而来的一种面向对象的编程语言。 本章讲述 C++ 语言的简史,以及 C++ 语言中与面向对象关系不大、C语言中没有的特性。这些特性能够增加编程的便利性,提高程序的可扩充性。 inline 可以只在函数定义处添加,也可以只在函数声明处添加,也可以同时添加

    2024年02月02日
    浏览(39)
  • 计算机网络技术与JAVA网络编程URL编程-----JAVA入门基础教程-----计算机网络经典

    import org.junit.jupiter.api.Test; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { //URL:统一资源定位符(种子),一个URL就定位着互联网上某个资源的地址 //http:应用层协议,IP地址,端口号,资源地址,参数

    2024年02月15日
    浏览(41)
  • 计算机网络技术与JAVA网络编程UDP编程-----JAVA入门基础教程-----计算机网络经典

    import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.*; public class UDP { public static void main(String[] args) { DatagramSocket datagramSocket = null; try { datagramSocket = new DatagramSocket(); InetAddress inetAddress = InetAddress.getByName(\\\"127.0.0.1\\\"); int port = 9090; byte[] byte

    2024年02月15日
    浏览(41)
  • C++入门(保姆级教程)

    目录 一、C++ 二、命名空间 2.1 C语言中的命名冲突  2.2 C++中命名空间 2.2.1 命名空间的定义 2.2.2 命名空间的特性 2.2.3 命名空间的使用 2.2.4 补充知识 2.2.4 C++库的命名空间 三、C++中的输入输出 四、缺省参数 4.1  定义 4.2 缺省参数的分类 4.2.1 全缺省参数 4.2.2 半缺省参数

    2024年02月07日
    浏览(37)
  • c++教程1快速入门

    欢迎来到令人兴奋的C++编程世界。本章将演示如何创建简单的C++程序,以及如何在程序中存储数据。 C++简介 安装编译器 编写第一个程序 编译和运行程序 创建变量 使用变量数组 使用向量数组 声明常量 C++是C编程语言的扩展,早在1972年由Dennis Ritchie首次在UNIX操作系统上实现

    2024年02月04日
    浏览(40)
  • C++引用10分钟入门教程

    我们知道,参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。 对于像 char、bool、int、float 等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组、结构体、

    2024年01月19日
    浏览(37)
  • 计算机网络技术与JAVA网络编程手写Socket聊天室-----JAVA入门基础教程-----计算机网络经典

    import java.io.*; import java.net.Socket; import java.util.Scanner; public class ChatClient { public static void main(String[] args) { try { Socket socket = new Socket(\\\"127.0.0.1\\\",9090); new Thread(new Runnable() { @Override public void run() { InputStream inputStream = null; while(true) { try { inputStream = socket.getInputStream(); } catch (IOException e)

    2024年02月15日
    浏览(51)
  • c++小学生入门教程(三)

    1、辗转相除法 两个正整数m,n的最大公约数  因为m与n和r都相关,所以求m和n的最大公约数等价于n和r的最大公约数      辗转相除法:欧几里得      ①求 m除以n的余数r r=m%n     ②当r!=0时,执行第③步,当r=0时,n就是最大公约数     ③让m=n,n=r,再求m除以n的余数r (新的m

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包