[学习opencv3] 阅读第二章

...
img_rgb = cv::imread( argv[1] );
...
cv::Vec3b intensity = img_rgb.at< cv::Vec3b >(y, x);
// ( Note: We could write img_rgb.at< cv::Vec3b >(x,y)[0] )

cv::Vec3b

先从C++ 的STL(Standard Template Library, 标准模板库)中的vector(矢量)开始了解[1]

向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。

在使用它时, 需要包含头文件 vector
#include<vector>

vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作。

可以使用[]符号如操作数组般读写其元素

Vec3b:
8U 类型的 RGB 彩色图像可以使用 Vec3b,3 通道 float 类型的矩阵可以使用 Vec3f。
对于 Vec 对象,可以使用[]符号如操作数组般读写其元素,如:
Vec3b color; //用 color 变量描述一种 RGB 颜色
color[0]=255; //B 分量
color[1]=0; //G 分量
color[2]=0; //R 分量

img_rgb.at

操作单个像素方法:[4]
at(int y, int x)
cv::mat的成员函数: at(int y, int x)可以用来存取图像中对应坐标为(x,y)的元素坐标。但是在使用它时要注意,在编译期必须要已知图像的数据类型,这是因为cv::mat可以存放任意数据类型的元素。因此at方法的实现是用模板函数来实现的。

使用方法:假设提前已知一幅图像img的数据类型为 unsigned char型灰度图(单通道),要对坐标为(10,12)的像素重新赋值为128,则对应操作如下:

img.at<uchar>(12,10) = 128;

如果要操作的图片img是一幅数据类型同样为unsigned char的彩色图片,再次要求将坐标(10,12)的像素赋值为128。这个操作跟上面的就有点区别了,需要对这个像素三个通道的每个对应元素赋值,Opencv中图像三原色在内存中的排列顺序为B-G-R(见下面注释),操作过程如下:

img.at<cv::Vec3b>(12,10) [0]= 128;//B
img.at< cv::Vec3b >(12,10) [1]= 128;//G
img.at< cv::Vec3b >(12,10) [2]= 128;//R

参考资料

[1]http://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html
[2]https://blog.csdn.net/qq_29540745/article/details/52517269
[3]https://blog.csdn.net/wenhao_ir/article/details/50946638
[4]https://blog.csdn.net/liukun321/article/details/38402601

HighGUI模块

作用是与从摄像头读取的实时视频数据流进行交互。

cv::VideoCapture 视频捕获

这个方法很接近与使用cv::VideoCapture从硬盘读取视频的方式,事实上,cv::VideoCapture对磁盘上的文件和摄像头是有一致接口的。

cv::VideoWriter

创建一个写入对象以便将帧依次写入到一个视频文件中

在opencv4中 VideoWriter::fourcc选择编解码器方法的变动

官方文档上的描述:
用于压缩帧的四字符编解码器代码。例如,VideoWriter::fourcc(‘P’,‘I’,‘M’,‘1’)是一个MPEG-1编解码器,VideoWriter::fourcc(‘M’,‘J’,‘P’,‘G’)是一个运动jpeg编解码器等。代码列表可在视频编解码器上通过FOURCC页面获得。带有MP4容器的FFMPEG后端本机使用其他值作为fourcc代码:请参阅ObjectType,因此您可能会收到OpenCV关于fourcc代码转换的警告消息。
在这里插入图片描述
在这里插入图片描述

使用方法

/*
示例来自opencv官方文档:https://docs.opencv.org/4.1.0/df/d94/samples_2cpp_2videowriter_basic_8cpp-example.html#a5

这里只截取了部分:
*/
...
    VideoWriter writer;
    int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');  // select desired codec (must be available at runtime)
    double fps = 25.0;                          // framerate of the created video stream
    string filename = "./live.avi";             // name of the output video file
    writer.open(filename, codec, fps, src.size(), isColor);

第一步:实例化VideoWriter对象

VideoWriter writer;

第二步:选择所需的编解码器

  int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');  // select desired codec 

第三步:调用

 writer.open(filename, codec, fps, src.size(), isColor);

书中实例应调整为

  cv::VideoWriter writer;
  writer.open( argv[2], CV_FOURCC('M','J','P','G'), fps, size );

  cv::Mat logpolar_frame, bgr_frame;

调整后:

	cv::VideoWriter writer;
	int codec = writer.fourcc('M', 'J', 'P', 'G');
	writer.open(argv[2], codec, fps, size);

	cv::Mat logpolar_frame, bgr_frame;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值