案例1:读取图片信息
如果是使用云服务器的话,由于图形界面的问题,使用cv::show来显示图片会报错
// 图片的读取和显示
// 导入opencv头文件
#include "opencv2/opencv.hpp"
#include <iostream>int main(int argc, char** argv)
{// 读取图片,mat是matrix的缩写,是一个矩阵,类似与numpy ndarraycv::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;// flipcv::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;
}