赞
踩
OpenCV是一个功能强大的计算机视觉库,广泛应用于图像和视频处理领域。它提供了许多图像和视频处理的函数和工具,包括加载、保存、缩放、旋转、裁剪、滤波、特征检测、跟踪、分割等等。本文将介绍一些常见的OpenCV函数及其作用,适合初学者入门。
当我们使用 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::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;
}
函数原型:
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;
}
函数原型:
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 来实现视频分析、视频处理等功能,如目标检测、人脸识别、车道检测等。
下面是一个简单的示例,演示了如何读取视频并显示其中的帧:
#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键按下,如果有则退出循环。
可以通过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是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了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。