当前位置:   article > 正文

C++ opencv操作入门教程_opencv c++入门

opencv c++入门

概述

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); // 构造一个从给定数据构造矩阵的方法
  • 1
  • 2
  • 3
  • 4

其中,参数含义如下:

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

常见函数

读取图像函数cv::imread

函数原型:

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

作用:从文件中读取图像

参数说明:
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

显示图像cv::imshow

函数原型:

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

作用:在窗口中显示图像

参数说明:
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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

函数原型:

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

作用: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");
  • 1

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

cv::VideoCapture cap(0);
  • 1

在实际应用中,可以利用 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在这个示例中,我们首先打开了一个名为“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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

该程序打开默认相机,并从相机中连续读取帧图像,然后将其显示在窗口中。当按下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>())
  • 1
  • 2

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

总结

本文简单介绍了OpenCV中常用的图像处理函数和类,包括图像读取和保存、图像显示、视频读取和显示等。这些函数和类都是OpenCV图像处理的基础,掌握了这些基础知识后,我们就可以更加深入地研究和应用OpenCV了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/129130
推荐阅读
相关标签
  

闽ICP备14008679号