C++——将TXT文件存储在cv::Mat数据结构

该博客介绍了如何使用C++将TXT文件中的数据转换为OpenCV的cv::Mat数据结构,并进行特征匹配。通过TxtToMat函数读取TXT文件内容并转换,然后用FlannBased匹配器进行特征匹配。转换数据类型至CV_32F以避免匹配错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <string>
#include <opencv2/flann/flann.hpp>
#include <opencv2/features2d/features2d.hpp>

cv::Mat Img1, Img2;

//函数的形参和返回值都不能是IO流对象,而应该是IO流引用(且不能为const)。
//注意这里使用了cv::Mat的引用为形参
//TxtToMat()函数将TXT文件里存储的内容转换成cv::Mat数据结构
void TxtToMat(std::ifstream & infile, cv::Mat & Img);

int main() {
	std::ifstream file("gendercenter1_1.txt");
	TxtToMat(file, Img1);
	Img1.convertTo(Img1, CV_32F);
	std::ifstream file1("agecenter1_1.txt");
	TxtToMat(file1, Img2);
	Img2.convertTo(Img2, CV_32F);
	cv::Ptr<cv::DescriptorMatcher> matchers = cv::DescriptorMatcher::create("FlannBased");
	//cv::BFMatcher matchers;
        //cv::FlannBasedMatcher matchers;
&nb
<think>我们参考用户提供的引用信息来解答如何获取cv::Mat的数据长度或大小用户的问题:我想获取OpenCVcv::Mat数据的长度或大小根据引用:[^2]提到:cv::Mat提供了丰富的接口,包括通过size()、cols、rows等获取图像的宽度和高度。[^4]给出了具体代码示例:cout<<image.size().width<<endl;//640cout<<image.size().height<<endl;//480cout<<image.cols<<endl;//640cout<<image.rows<<endl;//480另外,用户提到“数据长度”,可能有两种含义:1.图像的尺寸(宽度和高度)——即有多少行和多少列2.图像数据在内存中所占的字节数(即数据的总长度)根据引用[3]:用户似乎想获取数据长度(字节数),但遇到了问题。引用[3]中提到:"whenItrytogetthedatafromaframeandcalculatelength,itjustreturnsme0"因此,我们需要明确用户想要的是尺寸(行数和列数)还是内存中的字节大小。下面我们分别介绍:1.获取图像的尺寸(行数和列数):可以使用以下方法:-cols和rows成员变量:分别表示图像的列数(宽度)和行数(高度)。-size()成员函数:返回一个cv::Size结构,其中包含宽度(width)和高度(height)。2.获取图像数据的总字节数:注意:直接使用C++的sizeof操作符作用于cv::Mat对象,得到的只是cv::Mat对象本身的大小,而不是它所指向的图像数据的大小。正确的方法是:-使用成员函数`total()`获取图像的总像素数(即行数×列数)。-然后乘以每个像素所占的字节数(即每个通道的字节数×通道数)。每个像素的字节数可以通过类型和通道数计算:OpenCV中图像的数据类型由CV_<位数><数据类型>C<通道数>指定,例如CV_8UC3表示8位无符号整数3通道。具体可以使用`elemSize()`函数获取每个像素的字节数(即每个像素占多少个字节),或使用`elemSize1()`获取每个通道的每个元素(即一个数值)的字节数,然后乘以通道数。因此,总字节数=总像素数×每个像素的字节数=total()*elemSize()或者,也可以使用成员函数`total()*elemSize()`。另外,还有一个成员函数`step`(或`step1`)可以用来获取一行的字节数(step是字节数,step1是元素个数(按通道算))。为了防止类似引用[3]中遇到的问题(返回0),我们需要注意:当cv::Mat为空(即没有数据)时,total()返回0。因此,在获取数据长度之前,应确保cv::Mat对象已经正确初始化并包含数据。下面给出具体代码示例:</think> ### OpenCV 中获取 cv::Mat 数据长度/大小的方法 在 OpenCV 中获取 `cv::Mat` 的数据长度(尺寸或内存大小)主要通过以下方法实现: #### 1. **获取图像尺寸(宽度和高度)** ```cpp cv::Mat image = cv::imread("image.jpg"); int width = image.cols; // 图像宽度(像素) int height = image.rows; // 图像高度(像素) cv::Size size = image.size(); // 包含宽高的 Size 对象 ``` - `cols`:图像宽度(列数)[^4] - `rows`:图像高度(行数)[^4] - `size()`:返回包含宽高的 `cv::Size` 结构[^4] #### 2. **获取总像素数量** ```cpp long totalPixels = image.total(); // 总像素数 = rows × cols ``` #### 3. **计算数据总字节大小** ```cpp size_t totalBytes = image.total() * image.elemSize(); // 总字节数 ``` - `elemSize()`:单个像素的字节大小(如 CV_8UC3 为 3 字节)[^2] - `elemSize1()`:单个元素的字节大小(如 CV_8UC3 为 1 字节)[^2] #### 4. **验证数据有效性** ```cpp if(image.empty()) { std::cerr << "图像数据为空!" << std::endl; } ``` 在获取数据前务必检查图像是否加载成功[^3]。 #### 完整示例 ```cpp cv::Mat img(Size(500, 300), CV_8UC3, Scalar(0, 255, 0)); // 创建 500×300 的绿色图像 if(!img.empty()) { std::cout << "尺寸:" << img.size() << std::endl; // [500×300] std::cout << "宽度:" << img.cols << " 高度:" << img.rows << std::endl; // 500×300 std::cout << "总像素:" << img.total() << std::endl; // 150000 std::cout << "总字节数:" << img.total() * img.elemSize() << std::endl; // 450000 (CV_8UC3) } ``` ### 关键说明 1. **数据类型影响大小**:`CV_8UC1`(单通道)占1字节/像素,`CV_8UC3`(3通道)占3字节/像素[^1] 2. **ROI 区域**:若使用 `cv::Rect` 截取子区域,返回的 `cv::Mat` 仅包含该区域大小[^2] 3. **内存连续性**:使用 `isContinuous()` 检查数据在内存中是否连续存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值