qt使用opencv3将mat格式压缩成python的scipy.io生成的mat的格式
时间: 2024-05-16 07:16:42 浏览: 87
你可以使用OpenCV的imencode函数将Mat格式压缩为二进制格式,然后将其转换为Python的字符串格式。接下来,你可以使用SciPy的io.savemat函数将该字符串保存为MAT格式。
以下是示例代码:
```cpp
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
// 压缩为二进制格式
std::vector<uchar> buffer;
cv::imencode(".jpg", image, buffer);
// 转换为Python的字符串格式
std::string image_str(buffer.begin(), buffer.end());
// 保存为MAT格式
py::dict data;
data["image"] = np::fromstring(image_str.c_str(), image_str.size());
io::savemat("data.mat", data);
```
请注意,此示例假设你已经使用Pybind11将SciPy和NumPy模块导入到C++代码中。
相关问题
qt使用opencv将mat数据保存为python的scipy.io.savemat的格式
可以使用OpenCV和SciPy中的函数来实现将Mat数据保存为Python的Scipy.io.savemat格式。下面是一个简单的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <cstdlib>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <boost/filesystem.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/algorithm/string.hpp>
#include "json.hpp"
using namespace std;
using namespace cv;
namespace pt = boost::property_tree;
using json = nlohmann::json;
int main(int argc, char** argv) {
// 读取Mat数据
Mat img = imread("test.jpg");
// 将Mat数据转换为数组形式
vector<int> img_data;
for(int i=0;i<img.rows;i++) {
for(int j=0;j<img.cols;j++) {
Vec3b pixel = img.at<Vec3b>(i, j);
img_data.push_back(pixel[0]);
img_data.push_back(pixel[1]);
img_data.push_back(pixel[2]);
}
}
// 定义保存数据的json对象
json data;
data["img"] = img_data;
// 将json对象保存为文件
ofstream out_file("test.mat");
out_file << data;
out_file.close();
return 0;
}
```
这个示例程序将OpenCV读取的图像数据转换为一个vector<int>形式的数组,然后将这个数组保存到一个json对象中,最后使用ofstream将这个json对象保存到文件中。由于Scipy.io.savemat格式也是以JSON格式保存数据的,所以这个程序可以将Mat数据保存为Scipy.io.savemat格式。
qt使用opencv将二维数据保存为mat格式,并且要求数据部分与python的scipy.io生成的mat格式里data部分压缩方式一样
在Qt中使用OpenCV保存二维数据为Mat格式,可以使用以下代码:
```cpp
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
Mat saveDataAsMat(double* data, int rows, int cols)
{
Mat mat(rows, cols, CV_64F, data);
return mat;
}
int main()
{
// 二维数据
double data[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
// 保存为Mat格式
Mat mat = saveDataAsMat(&data[0][0], 3, 4);
// 保存为文件
FileStorage fs("data.mat", FileStorage::WRITE);
fs << "data" << mat;
fs.release();
return 0;
}
```
其中`saveDataAsMat`函数将二维数据转换为`cv::Mat`格式,`FileStorage`类用于将`cv::Mat`格式保存为文件。
要求保存的数据部分与Python的scipy.io生成的mat格式里data部分压缩方式一样,可以使用以下代码:
```cpp
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
using namespace cv;
Mat saveDataAsMat(double* data, int rows, int cols)
{
Mat mat(rows, cols, CV_64F, data);
return mat;
}
int main()
{
// 二维数据
double data[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
// 保存为Mat格式
Mat mat = saveDataAsMat(&data[0][0], 3, 4);
// 压缩方式
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(1);
// 保存为文件
FileStorage fs("data.mat", FileStorage::WRITE);
fs << "data" << "{";
write(fs, "compressed", mat, compression_params);
fs << "}";
fs.release();
return 0;
}
```
其中`compression_params`向量用于指定压缩方式,`write`函数用于将数据部分写入文件。
阅读全文