C++ opencv操作入门教程

概述基本数据类型图像处理数据类型cv::Mat

常见函数读取图像函数cv::imread显示图像cv::imshow颜色空间转换函数cv::cvtColor视频读取和显示类型示例代码1:读取视频并显示其中的帧示例代码2:从相机捕获视频流

cv::imencode编码传输总结

概述

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

#include

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

#include

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

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

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& buf, const std::vector& params = std::vector())

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

总结

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

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: