赞
踩
split函数的功能是通道分离
void split(const Mat& src,Mat *mvBegin)
void split(InputArray m, OutputArrayOfArrays mv);
第一个参数为要进行分离的图像矩阵,第二个参数可以是Mat数组的首地址,或者一个vector对象
std::vector<Mat> channels;
Mat aChannels[3];
//src为要分离的Mat对象
split(src, aChannels); //利用数组分离
split(src, channels); //利用vector对象分离
imshow("B",channels[0]);
imshow("G",channels[1]);
imshow("R",channels[2]);
cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600
uchar * pt_img00 = image.ptr<uchar>(0); //第一行第一个元素的指针
uchar * pt_img10 = image.ptr<uchar>(1); //第二行第一个元素的指针
uchar * pt_img01 = image.ptr<uchar>(0)[1]; //第一行第二个元素的指针
rows:行
cols:列
对于读入的这张1080p的星云图片,分辨率为1920*1080
image.rows = 1080 有1080行像素点
image.cols = 1920 有1920列像素点
Mat image = imread("星云.jpeg");
if (image.empty())
{
cout << "open file failed!" << endl;
return -1;
}
cout << "image::rows:" << image.rows << ", cols:" << image.cols << endl;
函数原型:void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;
winname:窗口名称
flags: 0 WINDOW_NORMAL 用户可以改变这个窗口大小
1 WINDOW_AUTOSIZE 默认窗口大小根据图片实际分辨率设定
2 WINDOW_OPENGL 窗口创建的时候会支持OpenGL
可以通过resizeWindow()函数修改窗口大小(仅限 WINDOW_NORMAL)
Mat img = imread(“星云.jpeg”);
namedWindow(“图片”, WINDOW_NORMAL);
resizeWindow(“图片”, 480, 270);
imshow(“图片”, img);
函数原型:
void cv::putText(
cv::Mat& img, // 待绘制的图像
const string& text, // 待绘制的文字
cv::Point origin, // 文本框的左下角
int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
double fontScale, // 尺寸因子,值越大文字越大
cv::Scalar color, // 线条的颜色(RGB)
int thickness = 1, // 线条宽度
int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
bool bottomLeftOrigin = false // true='origin at lower left'
);
附录:RGB颜色对照表
比如蓝色0 0 255,但是调用Scalar(255, 0, 0)
函数原型:
void rectangle(
InputOutputArray img, //被处理图片
Point pt1, //矩形框左上角坐标
Point pt2, //矩形右下角坐标
const Scalar& color, //矩形框颜色
int thickness = 1, //线条宽度
int lineType = LINE_8, //线段的类型
int shift = 0 //坐标点的小数点位数
);
/*1. 打开摄像头*/ VideoCapture capture(0); /*获取摄像头参数*/ brightness = capture.get(cv::CAP_PROP_BRIGHTNESS); contrast= capture.get(cv::CAP_PROP_CONTRAST); saturation = capture.get(cv::CAP_PROP_SATURATION); hue = capture.get(cv::CAP_PROP_HUE); gain = capture.get(cv::CAP_PROP_GAIN); exposure = capture.get(cv::CAP_PROP_EXPOSURE); white_balance = capture.get(cv::CAP_PROP_WHITE_BALANCE_BLUE_U); std::cout << "---------------------------------------------" << endl; std::cout << "摄像头亮度:" << brightness << endl; std::cout << "摄像头对比度:" << contrast << endl; std::cout << "摄像头饱和度:" << saturation << endl; std::cout << "摄像头色调:" << hue << endl; std::cout << "摄像头增益:" << gain << endl; std::cout << "摄像头曝光度:" << exposure << endl; std::cout << "摄像头白平衡:" << white_balance << endl; std::cout << "---------------------------------------------" << endl; /*2. 打开视频*/ VideoCapture capture(file_name); /*获取视频参数*/ frame_width = capture.get(cv::CAP_PROP_FRAME_WIDTH); frame_height = capture.get(cv::CAP_PROP_FRAME_HEIGHT); fps = capture.get(cv::CAP_PROP_FPS); frame_count = capture.get(cv::CAP_PROP_FRAME_COUNT); format = capture.get(cv::CAP_PROP_FORMAT); pos_avi_ratio = capture.get(cv::CAP_PROP_POS_AVI_RATIO); video_duration = frame_count / fps; cout << "---------------------------------------------" << endl; cout << "视频中的相对位置(范围为0.0到1.0):" << pos_avi_ratio << endl; cout << "视频帧的像素宽度:" << frame_width << endl; cout << "视频帧的像素高度:" << frame_height << endl; cout << "录制视频的帧速率(帧/秒):" << fps << endl; cout << "视频文件总帧数:" << frame_count << endl; cout << "图像的格式:" << format << endl; cout << "视频时长:" << video_duration << endl; cout << "---------------------------------------------" << endl;
VideoCapture.get()函数
函数原型:
double get(int propId) const;
propId编号:
编号1 详细参数 释义 英文说明
编号1 | 详细参数 | 释义 | 英文说明 |
---|---|---|---|
cv2.VideoCapture.get(0) | CV_CAP_PROP_POS_MSEC | 视频文件的当前位置(播放)以毫秒为单位 | Current position of the video file in milliseconds or video capture timestamp. |
cv2.VideoCapture.get(1) | CV_CAP_PROP_POS_FRAMES | 基于以0开始的被捕获或解码的帧索引 | 0-based index of the frame to be decoded/captured next. |
cv2.VideoCapture.get(2) | CV_CAP_PROP_POS_AVI_RATIO | 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。 | Relative position of the video file: 0 - start of the film, 1 - end of the film. |
cv2.VideoCapture.get(3) | CV_CAP_PROP_FRAME_WIDTH | 在视频流的帧的宽度 | Width of the frames in the video stream. |
cv2.VideoCapture.get(4) | CV_CAP_PROP_FRAME_HEIGHT | 在视频流的帧的高度 | Height of the frames in the video stream. |
cv2.VideoCapture.get(5) | CV_CAP_PROP_FPS | 帧速率 | Frame rate. |
cv2.VideoCapture.get(6) | CV_CAP_PROP_FOURCC | 编解码的4字-字符代码 | 4-character code of codec. |
cv2.VideoCapture.get(7) | CV_CAP_PROP_FRAME_COUNT | 视频文件中的帧数 | Number of frames in the video file. |
cv2.VideoCapture.get(8) | CV_CAP_PROP_FORMAT | 返回对象的格式 | Format of the Mat objects returned by retrieve() . |
cv2.VideoCapture.get(9) | CV_CAP_PROP_MODE | 返回后端特定的值,该值指示当前捕获模式 | Backend-specific value indicating the current capture mode. |
cv2.VideoCapture.get(10) | CV_CAP_PROP_BRIGHTNESS | 图像的亮度(仅适用于照相机) | Brightness of the image (only for cameras). |
cv2.VideoCapture.get(11) | CV_CAP_PROP_CONTRAST | 图像的对比度(仅适用于照相机) | Contrast of the image (only for cameras). |
cv2.VideoCapture.get(12) | CV_CAP_PROP_SATURATION | 图像的饱和度(仅适用于照相机) | Saturation of the image (only for cameras). |
cv2.VideoCapture.get(13) | CV_CAP_PROP_HUE | 色调图像(仅适用于照相机) | Hue of the image (only for cameras). |
cv2.VideoCapture.get(14) | CV_CAP_PROP_GAIN | 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升) | Gain of the image (only for cameras). |
cv2.VideoCapture.get(15) | CV_CAP_PROP_EXPOSURE | 曝光(仅适用于照相机) | Exposure (only for cameras). |
cv2.VideoCapture.get(16) | CV_CAP_PROP_CONVERT_RGB | 指示是否应将图像转换为RGB布尔标志 | Boolean flags indicating whether images should be converted to RGB. |
cv2.VideoCapture.get(17) | CV_CAP_PROP_WHITE_BALANCE | × 暂时不支持 | Currently not supported |
cv2.VideoCapture.get(18) | CV_CAP_PROP_RECTIFICATION | 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能) | Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently) |
另外:CV_8UC1,CV_8UC2,CV_8UC3 Vec2b Vec3b Vec4b 含义
在OpenCv中,使用Mat存图像,有专门的数据类型
一般的图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。 其中 U代表 Unsigned 无符号、C代表CvMat 后面的数字代表通道数,最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)
而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3…
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。
OpenCV 源代码中的定义:
typedef Vec <uchar, 2> Vec2b;
Vec2b—表示每个Vec2b对象中,可以存储2个char(字符型)数据
Vec3b—表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的
Vec4b—表示每一个Vec4b对象中,可以存储4个字符型数据,可以用这样的类对象去存储—4通道RGB+Alpha的图
函数原型:
CV_EXPORTS_W void Canny( InputArray image, //输入图像:8-bit
OutputArray edges, //输出边缘图像:单通道,8-bit,size与输入图像一致
double threshold1, //低阈值low
double threshold2, //高阈值high
int apertureSize = 3, //Sober算子大小
bool L2gradient = false //是否采用更精确的方式计算图像梯度
);
函数原型:
void GaussianBlur( InputArray src, //输入图像
OutputArray dst, //输出与图像
Size ksize, //高斯核大小
double sigmaX, // X方向上的高斯核标准偏差
double sigmaY = 0, //Y方向上的高斯核标准差
int borderType = BORDER_DEFAULT //像素外推方法
);
其中ksize核是一组权重的集合,会应用到原图像的一个区域,并由此生成图像目标的一个像素、比如大小为7的核意味着没49(7*7)个源图像的像素会产生目标图像的一个像素。在计算完中央像素与周围邻近像素的亮度差之和以后,如果亮度变化很大,中央像素的亮度会增加(反之则不会)。用另一句话就是如果一个像素比他周围的像素更突出,就会提升他的亮度。核越大,滤波后越模糊,边缘检测越稀疏;核越小,滤波越不明显,边缘检测线条越密集。
彩色图像:三个通道0-255,0-255,0-255,所以可以有2^24位空间
灰度图像:一个通道0-255,所以有256种颜色。255全白,0全黑
二值图像:只有两种颜色,黑和白,1白色,0黑色
函数原型:
cv::Threshold( const CvArr* src, //输入图像
CvArr* dst, //输出图像
double threshold, //阈值
double max_value,
int threshold_type //阈值类型
);
第五个参数类型:
emum{
THRESH_BINARY = 0, //当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
THRESH_BINARY_INV, //当前点值大于阈值时,设置为0,否则设置为Maxval
THRESH_TRUNC, //当前点值大于阈值时,设置为阈值,否则不改变
THRESH_TOZERO, //当前点值大于阈值时,不改变,否则设置为0
THRESH_TOZERO_INV, //当前点值大于阈值时,设置为0,否则不改变0
}threshold_type ;
生成关系如下表:
扩充src的边缘,将图像变大,然后以各种外插方式自动填充图像边界,这个函数实际上调用了函数cv::borderInterpolate,这个函数最重要的功能就是为了处理边界,比如均值滤波或者中值滤波中,使用copyMakeBorder将原图稍微放大,然后我们就可以处理边界的情况了
函数原型:
void copyMakeBorder(InputArray src, //源图像
OutputArray dst, //目标图像
int top,
int bottom,
int left,
int right,
int borderType, //定义要应用的边框类型
const Scalar& value = Scalar() ); //如果_borderType_为_BORDER_CONSTANT_,这是用于填充边框像素的值
其中top、bottom、left、right为图像每侧边框的长度(以像素为单位)。我们将它们定义为图像原始大小的5%。
最后一个参数类型:
emum{
BORDER_CONSTANT = 0, //一个常量像素值(由参数 value给定)填充扩充的边界值
BORDER_REPLICATE = 1, //复制最边缘像素的值
}_borderType_;
函数原型:
void cvtColor( InputArray src, //输入图像
OutputArray dst, //输出图像
int code, //转换的代码或标识
int dstCn = 0 //目标图像通道数,其值为0时,则有src和code决定
)
其中,对于code参数;
COLOR_BGR2RGB 转换为RGB
COLOR_BGR2GRAY 转换为灰度图
COLOR_BGR2YUV 转换为YUV
COLOR_BGR2HSV 转换为HSV
COLOR_BGR2YCrCb 转换为YCrCb
COLOR_BGR2HLS 转换为HLS
COLOR_BGR2XYZ 转换为XYZ
COLOR_BGR2LAB 转换为LAB
各种效果图如下:
函数原型:
VideoWriter(const String& filename, //输出文件名
int fourcc, //编码形式
double fps, //输出帧率
Size frameSize, //输出尺寸
bool isColor = true); //如果为False,可以传入灰度图片
例如:
VideoWriter writer("D:/opencv/pictures//test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);
使用实例:
VideoWriter writer;
writer.open("C:\Users\Desktop\test.avi",CV_FOURCC('M', 'J', 'P', 'G'),
rate, //不进行跟踪,定位,只显示、录制时的帧率
Size(inFrame.cols,inFrame.rows),
true);
if (!writer.isOpened())
{
return;
}
writer<<inFrame;
writer.release();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。