【OpenCV】关于Vec3b类型的含义与使用
opencv
OpenCV: 开源计算机视觉库
项目地址:https://gitcode.com/gh_mirrors/opencv31/opencv
免费下载资源
·
写在前面的话:
- 版权声明:本文为博主原创文章,转载请注明出处!
- 博主是一个小菜鸟,并且非常玻璃心!如果文中有什么问题,请友好地指出来,博主查证后会进行更正,啾咪~~
- 每篇文章都是博主现阶段的理解,如果理解的更深入的话,博主会不定时更新文章。
- 本文初次更新时间:2020.12.04,最后更新时间:2020.12.04
正文开始
1. vector
此部分为C++
预备知识,比较熟练可忽略本部分内容。
1.1 vector简介
向量(Vector)
是一个封装了动态大小数组的顺序容器(Sequence Container),它能存放各种类型的对象。可以简单的认为vector
是一个能够存放任意类型的动态数组
。
使用vector
时需要引入:
#include <vector>
using namespace std;
1.2 vector示范
下面的语句,相当于声明了一个int数组
,没有指定大小,可以动态添加或删除元素:
vector<int> v; //声明一个 int 向量 v,未分配大小
2. Vec3b
2.1 定义
Vec3b
可以看作是vector<uchar, 3>
,即一个uchar
类型、长度为3的vector
向量。
简单来说,Vec3b
就是一个uchar
类型的数组
,长度为 3。
例如:
Vec3b color; //变量 color 是一个长度为 3 的 uchar 数组,用于描述 RGB 颜色
//在 OpenCV 中,颜色为 BGR,而不是 RGB
color[0] = 255; // 0 是 B 通道,该句修改 B 通道数据
color[1] = 255; // 1 是 G 通道,该句修改 G 通道数据
color[2] = 255; // 2 是 R 通道,该句修改 R 通道数据
2.2 读取像素
由于在OpenCV
中,使用imread
读取到的Mat
图像数据,都是用uchar
类型的数据存储,对于RGB三通道
的图像,每个点的数据都是一个Vec3b
类型的数据。
使用at
定位方法如下:
Mat mat = imread("test.jpg");
//(row, col)即所需要定位点的坐标
mat.at<Vec3b>(row, col)[0] = 255; //修改点 (row, col) 的 B 通道数据
mat.at<Vec3b>(row, col)[1] = 255; //修改点 (row, col) 的 G 通道数据
mat.at<Vec3b>(row, col)[2] = 255; //修改点 (row, col) 的 R 通道数据
再如下例,返回值为<>
中的类型:
Mat mat;
mat.at<uchar>(row, col); //单通道,返回一个 uchar 类型值
mat.at<Vec3b>(row, col); //三通道,返回 <Vec3b>,即返回一个 uchar 数组,长度为 3
mat.at<Vec4b>(row, col); //四通道
需要注意的是,上例中返回的都是uchar
类型,直接使用cout
输出为字符格式,需要强制转换为int
类型之后输出:
Vec3b bgr = frame.at<Vec3b>(i, j);
printf("b = %d, g = %d, r = %d\n", bgr[0], bgr[1], bgr[2]);
//或
cout << (int)bgr[0] << ", " << (int)bgr.val[1] << ", " << (int)bgr.val[2] << endl;
2.3 使用
从摄像头中抓取一帧,并读取图像像素值:
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture;
capture.open(0); //读入默认摄像头
if (!capture.isOpened()) {
cout << "video not open.\n";
return -1;
}
Mat frame;
capture >> frame; //读一帧
if (frame.empty()) {
cout << "get frame error.\n";
return -1;
}
//遍历该图像每一个像素,并输出 BGR 值
for (int i = 0; i < frame.rows; i++) {
for (int j = 0; j < frame.cols; j++) {
Vec3b bgr = frame.at<Vec3b>(i, j);
printf("b = %d, g = %d, r = %d\n", bgr[0], bgr[1], bgr[2]);
}
}
return 0;
}
参考
GitHub 加速计划 / opencv31 / opencv
77.38 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
c3747a68
Added Universal Windows Package build to CI. 7 天前
9b635da5 - 7 天前
更多推荐
已为社区贡献6条内容
所有评论(0)