😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍OpenCV图像基本操作。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞
常用的几个函数:
imread:图像读取(路径+图像属性)
imshow:图像显示(窗口名+图像对象)
namedWindow:定义窗口属性(窗口名+窗口类型)
示例:
#include
#include
using namespace cv;
using namespace std;
int main()
{
//Mat src = imread("./data/test-fisheye.png",IMREAD_GRAYSCALE); // 灰度
Mat src = imread("./data/test.png"); // 彩色
// 判断图像是否存在
if (src.empty())
{
printf("could not load image!");
return -1;
}
namedWindow("Display", WINDOW_FREERATIO); // 创建窗口
imshow("Display", src); // 显示
waitKey(0); // 等待任意按键
destroyAllWindows(); // 销毁
return 0;
}
常用函数:
cvtColor:色彩空间转换函数(灰度、彩色、HSV)
imwrite:图像保存函数(保存路径,图像对象)
示例:
#include
#include
using namespace cv;
using namespace std;
void colorSpace_Demo(Mat &image);
int main()
{
//Mat src = imread("./data/test-fisheye.png",IMREAD_GRAYSCALE);
Mat src = imread("./data/test.png");
// 判断图像是否存在
if (src.empty())
{
printf("could not load image!");
return -1;
}
//namedWindow("Display", WINDOW_FREERATIO);
imshow("Display", src);
colorSpace_Demo(src); //转换hsv和gray
waitKey(0);
destroyAllWindows();
return 0;
}
void colorSpace_Demo(Mat &image)
{
Mat gray, hsv;
cvtColor(image, hsv, COLOR_BGR2HSV); //H 0~180,S V 0~255 颜色和亮度
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("GRAY", gray);
imwrite("./hsv.png", hsv);
imwrite("./gray.png", gray);
}
常用函数:
Mat::zeros:空白图像(大小+通道数)
Scalar:赋值(BGR)
示例:
#include
#include
using namespace cv;
using namespace std;
void mat_creation_demo() ;
int main()
{
mat_creation_demo();
waitKey(0);
destroyAllWindows();
return 0;
}
void mat_creation_demo()
{
//void mat_creation_demo(Mat &image)
//Mat m1, m2;
//m1 = image.clone(); //拷贝1
//image.copyTo(m2); //拷贝2
// 创建空白图像
Mat m3 = Mat::zeros(Size(400,400), CV_8UC3); //8uc1无符号8位,通道1
m3 = Scalar(255, 0, 0); // 赋值 B G R
std::cout << m3 << std::endl;
imshow("m3图像", m3); //以上就创建了一个纯蓝色图像
}
#include
using namespace cv;
int main()
{
// 打开视频文件
VideoCapture capture("input.mkv");
// 检查视频是否成功打开
if (!capture.isOpened())
{
std::cout << "无法打开输入视频文件!" << std::endl;
return -1;
}
// 获取视频的帧率、宽度和高度
double fps = capture.get(CAP_PROP_FPS);
int width = capture.get(CAP_PROP_FRAME_WIDTH);
int height = capture.get(CAP_PROP_FRAME_HEIGHT);
// 创建输出视频文件
VideoWriter writer("output.mp4", VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(width, height));
// 检查视频文件是否成功创建
if (!writer.isOpened())
{
std::cout << "无法创建输出视频文件!" << std::endl;
return -1;
}
// 读取和写入每一帧
Mat frame;
while (capture.read(frame))
{
// 在每一帧上进行图像处理操作
// 这里省略了图像处理部分,你可以根据需要添加
// 写入处理后的帧到输出视频文件
writer.write(frame);
// 显示当前帧
imshow("Video", frame);
if (waitKey(30) == 'q')
break;
}
// 释放资源
capture.release();
writer.release();
return 0;
}
这里使用VideoCapture
类打开输入视频文件,使用VideoWriter
类创建输出视频文件(甚至可以进行格式转换)。
#include
#include
using namespace cv;
int main()
{
// 创建一个YAML文件节点
FileStorage fs("data.yaml", FileStorage::WRITE);
// 检查文件是否成功打开
if (!fs.isOpened())
{
std::cout << "无法打开数据文件!" << std::endl;
return -1;
}
// 写入数据到YAML文件
int intValue = 5;
float floatValue = 3.14;
std::string stringValue = "Hello, World!";
fs << "intValue" << intValue;
fs << "floatValue" << floatValue;
fs << "stringValue" << stringValue;
// 关闭YAML文件
fs.release();
// 重新打开YAML文件进行读取
FileStorage fs2("data.yaml", FileStorage::READ);
// 检查文件是否成功打开
if (!fs2.isOpened())
{
std::cout << "无法打开数据文件!" << std::endl;
return -1;
}
// 读取数据从YAML文件
int readIntValue;
float readFloatValue;
std::string readStringValue;
fs2["intValue"] >> readIntValue;
fs2["floatValue"] >> readFloatValue;
fs2["stringValue"] >> readStringValue;
// 输出读取的数据
std::cout << "intValue: " << readIntValue << std::endl;
std::cout << "floatValue: " << readFloatValue << std::endl;
std::cout << "stringValue: " << readStringValue << std::endl;
// 关闭YAML文件
fs2.release();
return 0;
}
结果如下:
%YAML:1.0
---
intValue: 5
floatValue: 3.1400001049041748e+00
stringValue: "Hello, World!"
以上。