/ 重载流运算符 friend std::ostream& operator<<(std::ostream& os, const IM_Image& params) { // 序列化各个字段 os << params.image << std::endl;; QList<QString> keys = params.TransformationMatrix.keys(); QList<cv::Mat> values = params.TransformationMatrix.values(); for (size_t i = 0; i < keys.size(); i++) { os << keys[i].toStdString() << std::endl;; // 将QString转为std::string后输出 os << values[i] << std::endl; // 直接输出cv::Mat对象 } os << params.Barcode.toStdString() << std::endl; os << params.ID << std::endl; } friend std::istream& operator>>(std::istream& is, IM_Image& params) { }
时间: 2024-03-06 13:50:50 浏览: 56
这段代码中,是IM_Image类中重载的另一个流运算符,用于将流is中的数据反序列化为IM_Image对象params。具体实现方法是,依次从流中读取各个字段的值,并赋值给params中对应的成员变量。
对于image成员变量,可以直接从流中读取cv::Mat对象,代码如下:
```
is >> params.image;
```
对于TransformationMatrix成员变量,需要逐行读取流中的数据,将每一行按照特定的分隔符(如逗号)分成两部分,分别作为key和value添加到QMap对象中。具体代码如下:
```
QMap<QString, cv::Mat> TransformationMatrix;
while(!is.eof()) {
std::string line;
std::getline(is, line); // 逐行读取数据
if(line.empty()) {
continue;
}
std::istringstream iss(line);
std::string key;
std::getline(iss, key, ','); // 以逗号为分隔符,分离出key
cv::Mat value;
iss >> value; // 直接从流中读取cv::Mat对象
TransformationMatrix.insert(key.c_str(), value); // 将key-value添加到QMap中
}
params.TransformationMatrix = TransformationMatrix; // 将得到的QMap赋值给params中的成员变量
```
对于Barcode和ID成员变量,可以直接从流中读取其值,并赋值给params中对应的成员变量,代码如下:
```
std::string barcode;
std::getline(is, barcode);
params.Barcode = QString::fromStdString(barcode);
is >> params.ID;
```
上述代码中,对于Barcode成员变量,需要将std::string类型的值转为QString类型。因此使用了QString::fromStdString()函数。
阅读全文