一、图像相关的操作
1、图像的读取
原函数:Mat imread( const String& filename, int flags = IMREAD_COLOR );
说明:filename参数为图像文件的路径一定要注意你的图片的名称不要搞错,刚开始的时候图片名由于是英文的搞了好长时间才发现是图片名称打错了;flags参数为图像文件解析的方式,支持的方式有如下:
IMREAD_UNCHANGED:不对图像文件进行任何转换,直接读取;
IMREAD_GRAYSCALE:将图像转换为灰度图像(单通道)进行读取;
IMREAD_COLOR:将图像转为RGB彩色图像(三通道)进行读取;
IMREAD_ANYDEPTH:如果不设置这个参数,16/32位图像将会自动转为8位图像;
IMREAD_ANYCOLOR:将按照图像文件设定的颜色格式进行图像读取;
IMREAD_LOAD_GDAL:调用gdal库进行图像文件读取(可以简单地理解为读取TIFF图像文件)。
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char const* argv[])
{
cv::Mat img = cv::imread("D://RM//练习//opencv练习2//opencv-logo.png", cv::IMREAD_GRAYSCALE);
std::cout << "宽度: " << img.cols << std::endl;
std::cout << "高度: " << img.rows << std::endl;
std::cout << "通道数: " << img.channels() << std::endl;
//elemSize函数返回的是一个像素占用的字节数
std::cout << "深度: " << img.elemSize() / img.channels() * 8 << std::endl;
return 0;
}
其中通道数(我不是很理解这个通道数)描述一个像素点的时候,如果是灰度,那么只需要一个数值来描述它,就是单通道。
如果一个像素点,他又RGB三种颜色来描述他,那么他就是三通道。
2、图像显示
图像显示函数为:imshow(const string&winname,InputArray mat);
其中,winname表示显示图像窗口的名称,mat参数表示需要显示的图像。对于这个函数,需要注意的是,imshow函数只支持8位灰度图像、8位彩色图像和32位灰度图像(像素值范围0-1)
代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char const *argv[])
{
cv::Mat img = cv::imread("D://RM//练习//opencv练习1//opencv-logo.png", cv::IMREAD_GRAYSCALE);
cv::imshow("hello", img);
cv::waitKey();
return 0;
waitKey()的作用是让图片一直显示。
其中原图片为:
运行后的图片为:
3、图像保存
图像保存的函数: imwrite。
函数原型为:bool imwrite(const string &filename,InputArray img,const std::vector<int>& params = std::vector<int>());
filename为你的图片文件名,img表示Mat类型的图像数据。params参数表示为特定格式保存的参数编码,它有一个默认值std::vector(),所以一般情况下不用写。
eg:
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char const *argv[])
{
cv::Mat img = cv::imread("test.png", cv::IMREAD_GRAYSCALE);
cv::imwrite("test_copy.png", img);
return 0;
}
保存的时候会给你保存到你当前的工程当中。
二、视频处理
1、视频读取
以下代码段内容摘自Yngz_Miao:”
视频的属性:
属性值 属性含义
CV_CAP_PROP_POS_MSEC 以毫秒计算的当前的位置
CV_CAP_PROP_POS_FRAMES 以帧计算当前的位置
CV_CAP_PROP_POS_AVI_RATIO 视频的相对位置,0表示视频开始,1表示视频结束
CV_CAP_PROP_FRAME_WIDTH 帧宽度
CV_CAP_PROP_FRAME_HEIGHT 帧高度
CV_CAP_PROP_FPS 帧率
CV_CAP_PROP_FOURCC 4字符编码方式
CV_CAP_PROP_FRAME_COUNT 视频帧数
CV_CAP_PROP_FORMAT 视频格式
CV_CAP_PROP_MODE
CV_CAP_PROP_BRIGHTNESS 对比度
CV_CAP_PROP_SATURATION 饱和度
CV_CAP_PROP_HUE 色调
CV_CAP_PROP_GAIN 增益
CV_CAP_PROP_EXPOSURE 曝光
CV_CAP_PROP_CONVERT_RGB 图像是否应转换为RGB的标志
CV_CAP_PROP_WHITE_BALANCE 白平衡
CV_CAP_PROP_RECTIFICATION
代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
//videocapture结构创建一个catture视频对象
VideoCapture capture;
//连接视频
capture.open("D://RM//练习//视频的读取//vtest.avi");
if (!capture.isOpened()) {
printf("could not load video data...\n");
return -1;
}
int frames = capture.get(CAP_PROP_FRAME_COUNT);//获取视频针数目(一帧就是一张图片)
double fps = capture.get(CAP_PROP_FPS);//获取每针视频的频率
// 获取帧的视频宽度,视频高度
Size size = Size(capture.get(CAP_PROP_FRAME_WIDTH), capture.get(CAP_PROP_FRAME_HEIGHT));
cout << frames << endl;
cout << fps << endl;
cout << size << endl;
// 创建视频中每张图片对象
Mat frame;
namedWindow("D://RM//练习//视频的读取//vtest.avi", WINDOW_AUTOSIZE);
// 循环显示视频中的每张图片
for (;;)
{
//将视频转给每一张张图进行处理
capture >> frame;
//省略对图片的处理
//视频播放完退出
if (frame.empty())break;
imshow("D://RM//练习//视频的读取//vtest.avi", frame);
//在视频播放期间按键退出
if (waitKey(33) >= 0) break;
}
//释放
capture.release();
return 0;
}
2、视频的保存
函数:VideoWriter::VideoWriter(const string& filename, int fourcc,
double fps, Size frameSize, bool isColor=true);
其中filename参数表示文件名,fourcc参数表示编码格式,fps参数表示视频帧率,frameSize表示视频的尺寸大小。
#include <opencv2/opencv.hpp>
#include<iostream>
int main(int argc, char** argv)
{
cv::VideoCapture cap;
cap.open("D://RM//练习//视频的读取//vtest.avi");
if (!cap.isOpened())
return 0;
int width = cap.get(cv::CAP_PROP_FRAME_WIDTH); //帧宽度
int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); //帧高度
int totalFrames = cap.get(cv::CAP_PROP_FRAME_COUNT); //总帧数
int frameRate = cap.get(cv::CAP_PROP_FPS); //帧率 x frames/s
//auto code = cap.get(cv::CAP_PROP_FOURCC);
int ex = static_cast<int>(cap.get(cv::CAP_PROP_FOURCC));
char EXT[] = { (char)(ex & 0XFF),(char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24),0 };
cv::VideoWriter wri;
wri.open("D://RM//练习//视频的读取//vtest.avi", ex, frameRate, cv::Size(width, height));
cv::Mat frame;
while (1) {
cap >> frame;
if (frame.empty())
break;
wri << frame;
}
cap.release();
wri.release();
return 0;
}