Opencv用image.at<T>(rows,cols)读取像素以及像素值的连续存储

image.at(rows,cols)

image.at<T>(rows,cols)是个模板函数[1],T代表数据类型,比如常用[4]的是image.at<Vec3b>(rows,cols);而查看Vec3b的定义可知Vec3b就是uchar的数组,长度为3:

typedef Vec<uchar, 3> Vec3b;

函数的输入参数rows,cols是像素坐标,以Vec3b为例,相当于在(rows,cols)像素坐标处以Vec3b格式读取数据,其顺序为BGR,函数的返回值为uchar类型,使用以下代码可以分别读取第0行第1列B、G、R

	uchar i00 = image.at<Vec3b>(0, 1)[0]; //B
	uchar i01 = image.at<Vec3b>(0, 1)[1]; //G
	uchar i02 = image.at<Vec3b>(0, 1)[2]; //R

那么如果是灰度图[2]的话,只有一个通道,就可以用image.at<uchar>(rows,cols)来访问

mat像素值的连续存储

对于下面这句代码

uchar i03 = image.at<Vec3b>(0, 1)[5]; //

Vec3b长度为3,[5]已经越界,调试运行()遇到错误提示后,点击继续还能看到i3被赋值,是因为OpenCV内部存储每一行像素数据以及像素内部通道数据都是连续存储的[3],实际读取的为image.at(0, 2)[2]。
但是行与行的数据并不一定是连续存储的,所以不能应用在行与行之间。

实例

代码如下

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	Mat image = imread(".\\images\\000.png");

	uchar i00 = image.at<Vec3b>(0, 1)[0]; //B
	uchar i01 = image.at<Vec3b>(0, 1)[1]; //G
	uchar i02 = image.at<Vec3b>(0, 1)[2]; //R

	uchar i03 = image.at<Vec3b>(0, 1)[5]; //

	uchar i10 = image.at<Vec3b>(0, 2)[0]; //B
	uchar i11 = image.at<Vec3b>(0, 2)[1]; //G
	uchar i12 = image.at<Vec3b>(0, 2)[2]; //R
	
	Mat image2;
	cv::cvtColor(image, image2, cv::COLOR_BGR2GRAY);

	uchar gray00 = image2.at<uchar>(0, 0); //
	uchar gray01 = image2.at<uchar>(0, 1); //
	uchar gray02 = image2.at<uchar>(0, 2); //

	system("pause");
	return 0;
}

在system(“pause”);这里加个断点,调试运行遇到异常点击继续
在这里插入图片描述
可以看到image.at<Vec3b>(0, 1)[5];其实读取的是image.at<Vec3b>(0, 2)[2];的值
,证明了RGB像素值的连续存储在这里插入图片描述
image.at<uchar>(rows,cols)来访问灰度图的单通道
在这里插入图片描述

参考

[1]. Opencv之Vec3b是什么东东
[2]. OpenCV图像处理入门即巅峰:Mat的使用(灰度转换)
[3]. OpenCV之imread解析
[4]. opencv像素基本操作及图像遍历at

如有错漏,敬请指正
--------------------------------------------------------------------------------------------诺有缸的高飞鸟202104

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 C++ 中使用 OpenCV 读取 txt 文件并将其解析为 vector<string> 格式可以使用以下代码: ``` #include <opencv2/opencv.hpp> #include <vector> #include <string> using namespace std; int main() { string filename = "example.txt"; vector<string> data; ifstream file(filename); if(file.is_open()) { string line; while(getline(file, line)) { data.push_back(line); } file.close(); } return 0; } ``` 在这段代码中,我们首先声明了一个文件名变量,一个 vector 变量 data 和一个 ifstream 变量 file。然后我们使用 ifstream 类的构造函数打开文件,并使用 is_open() 函数判断文件是否正常打开。如果文件打开成功,我们使用 getline() 函数逐行读取文件的内容并将每行的内容插入到 vector 变量 data 中。最后,我们关闭文件。 ### 回答2: 在C中通过OpenCV读取txt文件,并将其解析为vector<string>格式的步骤如下: 1. 导入必要的头文件: ```c++ #include <iostream> #include <fstream> #include <vector> #include <opencv2/opencv.hpp> ``` 2. 创建一个函数来读取txt文件并解析为vector<string>格式: ```c++ std::vector<std::string> readTXTFile(const std::string& filename) { std::vector<std::string> lines; std::ifstream file(filename); if (file.is_open()) { std::string line; while (std::getline(file, line)) { lines.push_back(line); } file.close(); } else { std::cout << "Error opening file: " << filename << std::endl; } return lines; } ``` 3. 使用OpenCV中的 imread 函数读取txt文件: ```c++ std::string filename = "data.txt"; // txt文件名 cv::Mat image = cv::imread(filename, cv::IMREAD_GRAYSCALE); ``` 4. 将读取的图像数据解析为vector<string>格式: ```c++ std::vector<std::string> lines; for (int i = 0; i < image.rows; i++) { std::string line; for (int j = 0; j < image.cols; j++) { int pixel_value = static_cast<int>(image.at<uchar>(i, j)); line += std::to_string(pixel_value) + " "; } lines.push_back(line); } ``` 5. 打印解析后的数据: ```c++ for (const auto& line : lines) { std::cout << line << std::endl; } ``` 以上是通过OpenCV在C中读取txt文件并将其解析为vector<string>格式的步骤。 ### 回答3: 在C++中利用OpenCV读取txt文件并解析为vector<string>格式可以通过以下步骤实现: 1. 首先,需要包含OpenCV的头文件和iostream头文件: ```c++ #include <opencv2/opencv.hpp> #include <iostream> ``` 2. 接下来,创建一个函数来读取txt文件并解析为vector<string>格式,函数原型如下: ```c++ std::vector<std::string> readTxtFile(const std::string& filename); ``` 3. 在函数中,首先定义一个存储解析后字符串的vector<string>,例如: ```c++ std::vector<std::string> strVector; ``` 4. 使用OpenCV的FileStorage类来读取txt文件: ```c++ cv::FileStorage fs(filename, cv::FileStorage::READ); if (!fs.isOpened()) { std::cerr << "Failed to open txt file." << std::endl; return strVector; } ``` 5. 利用OpenCV的FileNode和FileNodeIterator对文件进行解析: ```c++ cv::FileNode rootNode = fs["data"]; if (rootNode.empty()) { std::cerr << "Empty data node." << std::endl; return strVector; } cv::FileNodeIterator it = rootNode.begin(); cv::FileNodeIterator it_end = rootNode.end(); for (; it != it_end; ++it) { std::string str = (std::string)*it; strVector.push_back(str); } ``` 6. 最后,返回解析后的字符串向量: ```c++ return strVector; ``` 以下是完整的示例代码: ```c++ #include <opencv2/opencv.hpp> #include <iostream> std::vector<std::string> readTxtFile(const std::string& filename) { std::vector<std::string> strVector; cv::FileStorage fs(filename, cv::FileStorage::READ); if (!fs.isOpened()) { std::cerr << "Failed to open txt file." << std::endl; return strVector; } cv::FileNode rootNode = fs["data"]; if (rootNode.empty()) { std::cerr << "Empty data node." << std::endl; return strVector; } cv::FileNodeIterator it = rootNode.begin(); cv::FileNodeIterator it_end = rootNode.end(); for (; it != it_end; ++it) { std::string str = (std::string)*it; strVector.push_back(str); } return strVector; } int main() { std::vector<std::string> strVector = readTxtFile("data.txt"); for (const auto& str : strVector) { std::cout << str << std::endl; } return 0; } ``` 这样,就可以通过OpenCV读取txt文件并解析为vector<string>格式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺有缸的高飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值