【Qt+opencv】图片与视频的操作
@TOC
前言
在现代计算机视觉应用中,图像和视频处理起着至关重要的作用。这些应用范围广泛,包括图像识别、物体跟踪、3D建模等。为了实现这些功能,我们需要使用强大的工具和库。OpenCV(开源计算机视觉库)就是其中之一,它提供了大量的函数和模块,可以处理图像和视频数据。另一方面,Qt是一个用于开发GUI应用程序的框架,它的强大之处在于其跨平台性和易用性。结合这两个工具,我们可以创建出强大的图像和视频处理应用程序。
在本文中,我们将探讨如何使用Qt和OpenCV进行图像和视频的操作。我们将介绍一些基本的操作,如读取和显示图像,捕获和播放视频,以及一些更复杂的操作,如图像处理和视频分析。
图片的操作
图片的读取
imread
函数
函数原型:
cv::Mat cv::imread(const std::string& filename, int flags = IMREAD_COLOR)
参数:
filename
:要读取的图像文件的名称。flags
:指定图像应如何被读取的标志。可能的值包括:cv::IMREAD_COLOR
:加载彩色图像。任何图像的透明度都会被忽视。这是默认参数。cv::IMREAD_GRAYSCALE
:以灰度模式加载图像。cv::IMREAD_UNCHANGED
:加载图像,包括alpha通道。
返回值:返回一个cv::Mat
对象,该对象包含了图像的数据。
图片的写入
imwrite
函数
函数原型:
bool cv::imwrite(const std::string& filename, const cv::Mat& img, const std::vector<int>& params = std::vector<int>())
参数:
filename
:要写入的图像文件的名称。img
:要写入的图像。params
:对于特定格式的参数的向量,例如对于JPEG,可以通过传递两个参数[cv::IMWRITE_JPEG_QUALITY, 90]
来控制图像的质量。
返回值:如果图像被成功写入文件,则返回true
;否则,返回false
。
示例代码
以下是一个使用imread
和imwrite
的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 使用imread函数读取图像
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_COLOR);
if (img.empty()) {
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
// 对图像进行一些操作...
// ...
// 使用imwrite函数写入图像
if (!cv::imwrite("output.jpg", img)) {
std::cout << "Could not write the image" << std::endl;
return -1;
}
return 0;
}
在这个示例中,我们首先使用imread
函数读取一个图像文件,然后对图像进行一些操作,最后使用imwrite
函数将结果写入一个新的图像文件。注意,你需要确保输入图像文件存在,且程序有权限在指定位置写入文件。否则,imread
和imwrite
函数可能会失败。如果函数失败,它们会返回一个空的cv::Mat
或false
,你可以检查这些返回值来处理错误。。
视频的操作
打开视频
打开视频 VideoCapture类用于从摄像头或文件捕获视频。要从文件打开视频,你可以在创建VideoCapture对象时传递文件名作为参数。例如:
cv::VideoCapture cap("video.mp4");
你可以使用isOpened方法检查视频是否成功打开:
if (!cap.isOpened()) {
std::cout << "Error opening video file" << std::endl;
return -1;
}
然后,你可以使用read方法在循环中读取视频帧:
read的函数原型:
bool read (OutputArray image)
参数为你需要这帧保存的位置
返回值:false 如果没有抓取帧
cv::Mat frame;
while(cap.read(frame)) {
// 对帧进行处理...
}
示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 使用VideoCapture打开视频
cv::VideoCapture cap("video.mp4");
if (!cap.isOpened()) {
std::cout << "Error opening video file" << std::endl;
return -1;
}
cv::Mat frame;
while (cap.read(frame)) {
// 对帧进行处理,例如显示帧
cv::imshow("Frame", frame);
// 按ESC键退出
char c = (char)cv::waitKey(25);
if (c == 27) {
break;
}
}
cap.release();
cv::destroyAllWindows();
return 0;
}
关闭视频
写入视频 要写入视频,你需要创建一个VideoWriter对象。在创建VideoWriter对象时,你需要指定输出文件名、编码器、帧率和帧大小。例如:
构造函数的函数原型:
cv::VideoWriter::VideoWriter ( const String & filename,
int apiPreference,
int fourcc,
double fps,
const Size & frameSize,
const std::vector< int > & params
)
filename:这是一个字符串,表示要创建的视频文件的名称。
apiPreference:这是一个整数,用于指定首选的捕获API后端。一些常见的值包括cv::CAP_ANY(自动选择),cv::CAP_FFMPEG(使用FFmpeg库),cv::CAP_GSTREAMER(使用GStreamer库)等。如果你不确定应该使用哪个值,可以使用cv::CAP_ANY让OpenCV自动选择。
fourcc:这是一个整数,表示用于压缩视频的四字符代码(Four-Character Codes)。你可以使用cv::VideoWriter::fourcc函数来获取这个值。例如,cv::VideoWriter::fourcc(‘M’,‘J’,‘P’,‘G’)返回一个用于Motion-JPEG编码的fourcc代码。
fps:这是一个双精度浮点数,表示视频的帧率,即每秒钟的帧数。
frameSize:这是一个cv::Size对象,表示视频帧的大小。例如,cv::Size(640, 480)表示帧的宽度为640像素,高度为480像素。
params:这是一个整数向量,包含特定于编解码器的参数。例如,对于Motion-JPEG编码器,你可以通过std::vector<int>
{cv::IMWRITE_JPEG_QUALITY, 90}来设置JPEG质量为90(范围为0到100)。
cv::VideoWriter writer("output.mp4", cv::VideoWriter::fourcc('M','J','P','G'), 30, cv::Size(640, 480));
在这个例子中,我们使用fourcc函数指定了一个’MJPG’编码器。然后,你可以使用write方法将帧写入视频:
writer.write(frame);
最后,当你完成视频写入时,VideoWriter对象会在其析构函数中自动关闭文件。你也可以调用release方法手动关闭文件。
总结
通过本文,我们了解了如何使用Qt和OpenCV进行图像和视频的操作。我们学习了如何读取和显示图像,如何捕获和播放视频,以及如何进行一些基本的图像处理和视频分析。尽管我们只是涉及了这些主题的表面,但我们希望这足以激发你的兴趣,使你能够进一步探索这两个强大的工具。
Qt和OpenCV的结合为开发复杂的计算机视觉应用提供了巨大的可能性。无论你是一个有经验的开发者,还是一个刚刚开始接触这个领域的新手,我都鼓励你深入研究这些工具,发掘它们的潜力。
- 点赞
- 收藏
- 关注作者
评论(0)