案例1:读取图片信息
如果是使用云服务器的话,由于图形界面的问题,使用cv::show来显示图片会报错
// 图片的读取和显示
// 导入opencv头文件
#include "opencv2/opencv.hpp"
#include <iostream>
int main(int argc, char** argv)
{
// 读取图片,mat是matrix的缩写,是一个矩阵,类似与numpy ndarray
cv::Mat image = cv::imread("./media/cat.jpg");
// 判断是否读取成功
if (image.empty())
{
std::cout << "无法读取图片 " << std::endl;
return 1;
}
// 打印图片高度和宽度
std::cout << "图片高度: " << image.rows << " 宽度: " << image.cols << std::endl;
cv::imwrite("./output/gray.jpg", image);
// // 显示
// cv::imshow("原图", image);
// cv::imshow("灰度图", gray);
// // 等待按键
// cv::waitKey(0);
}
注:#include "opencv2/opencv.hpp"的时候在vscode里面会显示没有这个头文件,导致运行不了。解决方案:
方法1.鼠标放到红色波浪线位置,会有一个快速修复,点开之后将OpenCV的路径添加进去
方法2.有些vscode编译器可能没有自动添加到includepath的提示,操作如下:
案例2:读取视频信息
注:这里需要安装gflags,gflags安装教程
// 导入opencv 库
#include <opencv2/opencv.hpp>
#include <iostream>
// 导入gflags 库
#include <gflags/gflags.h>
// 定义命令行参数
DEFINE_string(video, "./media/dog.mp4", "Input video"); // 视频路径
int main(int argc, char **argv)
{
// 解析命令行参数
gflags::ParseCommandLineFlags(&argc, &argv, true);
// 读取视频:创建了一个VideoCapture对象,参数为视频路径
cv::VideoCapture capture(FLAGS_video);
// 判断视频是否读取成功,返回true表示成功
if (!capture.isOpened())
{
std::cout << "无法读取视频: " << FLAGS_video << std::endl;
return 1;
}
// 读取视频帧,使用Mat类型的frame存储返回的帧
cv::Mat frame;
// 灰度图
cv::Mat gray_frame;
// 循环读取视频帧
while (true)
{
// 读取视频帧,使用 >> 运算符或者read()函数,他的参数是返回的帧
capture.read(frame);
// capture >> frame;
// 判断是否读取成功
if (frame.empty())
{
std::cout << "文件读取完毕" << std::endl;
break;
}
// 转成灰度图
cv::cvtColor(frame, gray_frame, cv::COLOR_BGR2GRAY);
// 显示视频帧
cv::imshow("raw frame", frame);
cv::imshow("gray frame", gray_frame);
// 等待按键,延迟30ms,否则视频播放太快
int k = cv::waitKey(30);
// 按下ESC键退出
if (k == 27)
{
std::cout << "退出" << std::endl;
break;
}
}
return 0;
案例3:读取电脑摄像头信息
// 导入opencv 库
#include <opencv2/opencv.hpp>
#include <iostream>
// 导入gflags 库
#include <gflags/gflags.h>
// 定义命令行参数
DEFINE_int32(camera, 0, "Input camera"); // 摄像头编号
int main(int argc, char **argv)
{
// 解析命令行参数
gflags::ParseCommandLineFlags(&argc, &argv, true);
// 读取视频:创建了一个VideoCapture对象,参数为摄像头编号
cv::VideoCapture capture(FLAGS_camera);
// 设置指定摄像头的分辨率
int width = 640;
int height = 480;
// 设置摄像头宽度和高度
capture.set(cv::CAP_PROP_FRAME_WIDTH, width);
capture.set(cv::CAP_PROP_FRAME_HEIGHT, height);
// 判断视频是否读取成功,返回true表示成功
if (!capture.isOpened())
{
std::cout << "无法打开摄像头: " << FLAGS_camera << std::endl;
return 1;
}
// 读取视频帧,使用Mat类型的frame存储返回的帧
cv::Mat frame;
// 写入MP4文件,参数分别是:文件名,编码格式,帧率,帧大小
cv::VideoWriter writer("./output/record.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 20, cv::Size(width, height));
// 循环读取视频帧
while (true)
{
// 读取视频帧,使用 >> 运算符或者read()函数,他的参数是返回的帧
capture.read(frame);
// capture >> frame;
// flip
cv::flip(frame, frame, 1);
// 显示视频帧
cv::imshow("opencv demo", frame);
// 写入视频
writer.write(frame);
// 等待按键,延迟30ms,否则视频播放太快
int k = cv::waitKey(30);
// 按下ESC键退出
if (k == 27)
{
std::cout << "退出" << std::endl;
break;
}
}
return 0;
}