图像
/**
* @author IYATT-yx
* @date 2021/2/2
* @brief 显示图片和保存图片
*/
#include "opencv2/opencv.hpp"
int main(int argc, char *argv[])
{
if (argc > 2)
{
std::cout << "参数过多" << std::endl;
exit(EXIT_FAILURE);
}
else if (argc < 2)
{
std::cout << "请指定要打开的图片的路径" << std::endl;
exit(EXIT_FAILURE);
}
// 转存图片路径
std::string name = argv[1];
// 读取图片
// 不指定标志参数,默认为三通倒BGR彩色图像
cv::Mat img = cv::imread(name);
// 检测图片是否正确打开
if (img.empty())
{
std::cout << "请检查输入的图片路径是否存在" << std::endl;
exit(EXIT_FAILURE);
}
// 显示图片
// 参数分别为窗口名字和要显示的图像矩阵
cv::imshow(name, img);
// 在程序运行路径下将图片另存为 OpenCV.png
cv::imwrite("OpenCV.png", img);
// 显示窗口直到键盘按下才关闭
cv::waitKey(0);
}
视频
VideoWriter::fourcc('D', 'I', 'V', 'X')
MPEG-4编码
VideoWriter::fourcc('P', 'I', 'M', 1)
MPRG-1编码
VideoWriter::fourcc('M', 'J', 'P', 'G')
JPEG编码
VideoWriter::fourcc('M', 'P', '4', '2')
MPEG-4.2编码
VideoWriter::fourcc('D', 'I', 'V', '3')
MPEG-4.3编码
VideoWriter::fourcc('U', '2', '6', '3')
H263编码
VideoWriter::fourcc('I', '2', '6', '3')
H2631编码
VideoWriter::fourcc('F', 'L', 'V', '1')
FLV1编码
/**
* @author IYATT-yx
* @date 2021/2/2
* @brief 从相机捕捉视频并保存视频或者播放视频文件(及视频源链接)
*/
#include "opencv2/opencv.hpp"
// 如果捕捉摄像头视频,则参数指定 c
// 如果播放视频文件,则分别指定参数 f 和 要打开的文件名
int main(int argc, char *argv[])
{
if (argc < 2 || argc > 3)
{
std::cout << "未指定参数或参数过多" << std::endl;
exit(EXIT_FAILURE);
}
if (argc == 2)
{
std::string flag = argv[1];
if (flag != "c")
{
std::cout << "参数错误" << std::endl;
exit(EXIT_FAILURE);
}
// 构造VideoCapture对象
// 可以使用命令 ls /dev/video* 查看本机的摄像头设备
// 摄像头序号按 0, 1, 2 ...排, 可以直接指定.
// 如果初始化设置 -1, 则默认使用最小的可用的摄像头
cv::VideoCapture camera(-1);
if (!camera.isOpened())
{
std::cout << "摄像头打开失败" << std::endl;
exit(EXIT_FAILURE);
}
// 用于暂存视频中一帧图像的矩阵
cv::Mat frame;
// 获取一帧图像用于下面得到摄像头的分辨率
camera >> frame;
// 用于保存视频的对象
// 保存的文件名, 编码类型指定, 帧率, 视频分辨率, 是否为彩色
cv::VideoWriter saveVideo("camera.avi", cv::VideoWriter::fourcc('D', 'I', 'V', 'X'),
25, frame.size(), frame.type() == CV_8UC3);
if (!saveVideo.isOpened())
{
std::cout << "创建视频文件失败" << std::endl;
// 释放摄像头
camera.release();
exit(EXIT_FAILURE);
}
// 循环从视频流中获取图片
while (camera.read(frame))
{
// 显示图片
cv::imshow("Camera", frame);
// 保存视频
saveVideo.write(frame);
// 每张图片显示40ms (1000 / 40 = 25 FPS )
// 同时按Esc键可退出
if (cv::waitKey(40) == 27)
{
std::cout << "退出程序" << std::endl;
break;
}
}
// 释放
camera.release();
saveVideo.release();
}
else if (argc == 3)
{
std::string flag = argv[1];
if (flag != "f")
{
std::cout << "参数错误" << std::endl;
exit(EXIT_FAILURE);
}
std::string fileName = argv[2];
// 读取视频文件(或 视频源链接)
cv::VideoCapture videoFile(fileName);
if (!videoFile.isOpened())
{
std::cerr << "视频文件打开失败" << std::endl;
exit(EXIT_FAILURE);
}
cv::Mat frame;
while (videoFile.read(frame))
{
cv::imshow("Video", frame);
if (cv::waitKey(40) == 27)
{
std::cout << "退出程序" << std::endl;
break;
}
}
videoFile.release();
}
}
摄像头
视频文件
视频源网址
绘图
/**
* @author IYATT-yx
* @date 2021/2/1
* @brief 绘图
*/
#include "opencv2/opencv.hpp"
int main()
{
// 创建背景画布
// 行(y), 列(x), 类型, 颜色
// Scalar(B, G, R)
cv::Mat img = cv::Mat(500, 800, CV_8UC3, cv::Scalar(0, 0, 0));
/**
* @brief 画直线
*
* @param . Mat矩阵
* @param . 起点坐标 Point(x, y)
* @param . 终点坐标
* @param . 直线的颜色
*/
cv::line(img, cv::Point(10, 20), cv::Point(600, 400), cv::Scalar(0, 255, 255));
/**
* @brief 画圆
*
* @param . Mat矩阵
* @param . 圆心坐标
* @param . 半径,单位为像素
* @param . 颜色
*/
cv::circle(img, cv::Point(500, 250), 100, cv::Scalar(255, 0, 255));
/**
* @brief 画矩形
*
* @param . 左上角坐标
* @param . 右上角坐标
* @param . 颜色
*/
cv::rectangle(img, cv::Point(500, 250), cv::Point(700, 350), cv::Scalar(255, 255, 0));
/**
* @brief 画椭圆
*
* @param . Mat矩阵
* @param . 中心坐标
* @param . 椭圆旋转角度 (角度制)
* @param . 椭圆的起始角度
* @param . 椭圆的终止角度
*/
cv::ellipse(img, cv::Point(400, 250), cv::Size(350, 200), 0, 0, 360, cv::Scalar(255, 255, 255));
/**
* @brief 添加文字 (不支持中文, 添加中文可以使用 freetype (contrib模块))
*
* @param . Mat矩阵
* @param . 要添加的文字
* @param . 字符串的左下角坐标
* @param . 字体类型,记不住查官方文档就行
* @param . 字体大小
*/
cv::putText(img, "ALRR a-rounder.com IYATT-yx", cv::Point(100, 200), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255));
cv::imshow("img", img);
cv::waitKey(0);
}
画板
/**
* @author IYATT-yx
* @date 2021/2/1
* @brief 画板
*/
#include "opencv2/opencv.hpp"
// 构建画布
cv::Mat img = cv::Mat(600, 900, CV_8UC3, cv::Scalar(255, 255, 255));
// 记录鼠标前一时刻的坐标
cv::Point prePoint;
// 画笔配色变量
int B = 0;
int G = 0;
int R = 0;
// 回调函数, 鼠标事件触发该函数进行绘图, 用到的标志可以查阅官方文档
void paint(int event, int x, int y, int flag, void *)
{
// 单击右键
if (event == cv::EVENT_RBUTTONDOWN)
{
std::cout << "点击鼠标左键才可以绘图" << std::endl;
}
// 单击鼠标左键
else if (event == cv::EVENT_LBUTTONDOWN)
{
prePoint = cv::Point(x, y);
std::cout << "起始点: " << prePoint << std::endl;
}
// 按住鼠标左键移动
if (event == cv::EVENT_MOUSEMOVE && (flag & cv::EVENT_FLAG_LBUTTON))
{
cv::Point point(x, y);
// 通过绘制直线(极短,高频)构成曲线
cv::line(img, prePoint, point, cv::Scalar(B, G, R), 3);
prePoint = point;
imshow("Drawing board", img);
}
}
int main()
{
// 显示画布
cv::imshow("Drawing board", img);
// 创建调色版 (滑动条)
cv::createTrackbar("B", "Drawing board", &B, 255);
cv::createTrackbar("G", "Drawing board", &G, 255);
cv::createTrackbar("R", "Drawing board", &R, 255);
// 鼠标响应
cv::setMouseCallback("Drawing board", paint);
cv::waitKey(0);
}