OpenCV 3.0 - 如何从 CSV 字符串创建 cv::Mat?
OpenCV 3.0 - How can I create a cv::Mat from CSV string?
我正在尝试从我从 python 脚本传输的 CSV 字符串创建 cv::Mat。我目前正在使用 python 2.7、C++ 和 OpenCV 3.0,我所能找到的只是如何在 OpenCV 2.4 中执行此操作,但问题是它与 3.0 有很大不同,其中 ml::TrainData 不知何故而是使用。我不明白它是如何工作的,也没有示例代码! :-(
我的 python-脚本所做的是将 np.array 作为 CSV 文件传输,它看起来像这样:
import sys
import numpy as np
import csv
csvToSend = csv.writer(sys.stdout, delimiter=',')
data = np.array([ [3, 7, 9],
[1, 7, 0],
[4, 12, 8]])
csvToSend.writerows(data)
python-脚本当前正在模拟相机发送 bgr RAW 格式的图片。
管道数据由我的 C++ 代码接收,代码目前是这样的:
#include <iostream>
#include <string>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
string values = "", csvPart;
Mat img;
int i;
int main()
{
for (i = 0; i < 3; i++)
{
cin >> csvPart; //here I get my CSV lines from python-script
if (values == "") values = values + csvPart;
else values = values + "\n" + csvPart; //makes the CVS lines look like a 3x3 matrix again
}
cout << values << endl; //prints the CVS to see that it looks like it did before piping it over to the C++ code
/* how the printed string looks like
3,7,9
1,7,0
4,12,8 */
/* Here I want to load the "values" into the Mat img
so I can do my mojo with openCV in C++ */
}
如果有人能帮助我解决这个问题并给我一个简单的代码示例,我将不胜感激。
如果有更好的方法将 np.array 通过管道传输到 C++ 代码并将其加载到 cv::Mat 中,我将为您张开双臂! ;-)
csv 文件的每一行代表一行。如果您的图像是 1 个通道,则每个值都是像素的灰度值:
1,2,3
4,5,6
7,8,9
生成的 3x3 1 通道图像为:
如果您的图像是 3 通道,则每行中的 3 个连续值代表一个 bgr 三元组。例如:
1,2,3,200,100,200
4,5,6,47,205,103
7,8,9,95,23,209
生成 3x2 3 通道图像:
loadFromCSV
函数接受csv内容的字符串,和OpenCV图像类型,returns图像:
Mat loadFromCSV(const string& values, int opencv_type);
查看完整代码:
#include <opencv2\opencv.hpp>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
using namespace cv;
Mat loadFromCSV(const string& values, int opencv_type)
{
Mat m;
stringstream ss(values);
string line;
while (getline(ss, line))
{
vector<double> dvals;
stringstream ssline(line);
string val;
while (getline(ssline, val, ','))
{
dvals.push_back(stod(val));
}
Mat mline(dvals, true);
transpose(mline, mline);
m.push_back(mline);
}
int ch = CV_MAT_CN(opencv_type);
m = m.reshape(ch);
m.convertTo(m, opencv_type);
return m;
}
int main()
{
string values = "1,2,3\n4,5,6\n7,8,9";
Mat img = loadFromCSV(values, CV_8UC1);
//Mat img = loadFromCSV(values, CV_8UC3);
//string values = "1,2,3,200,100,200\n4,5,6,47,205,103\n7,8,9,95,23,209";
//Mat img = loadFromCSV(values, CV_8UC3);
cout << "Img:" << endl;
cout << img << endl;
imshow("Img", img);
waitKey();
return 0;
}
我正在尝试从我从 python 脚本传输的 CSV 字符串创建 cv::Mat。我目前正在使用 python 2.7、C++ 和 OpenCV 3.0,我所能找到的只是如何在 OpenCV 2.4 中执行此操作,但问题是它与 3.0 有很大不同,其中 ml::TrainData 不知何故而是使用。我不明白它是如何工作的,也没有示例代码! :-(
我的 python-脚本所做的是将 np.array 作为 CSV 文件传输,它看起来像这样:
import sys
import numpy as np
import csv
csvToSend = csv.writer(sys.stdout, delimiter=',')
data = np.array([ [3, 7, 9],
[1, 7, 0],
[4, 12, 8]])
csvToSend.writerows(data)
python-脚本当前正在模拟相机发送 bgr RAW 格式的图片。
管道数据由我的 C++ 代码接收,代码目前是这样的:
#include <iostream>
#include <string>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
string values = "", csvPart;
Mat img;
int i;
int main()
{
for (i = 0; i < 3; i++)
{
cin >> csvPart; //here I get my CSV lines from python-script
if (values == "") values = values + csvPart;
else values = values + "\n" + csvPart; //makes the CVS lines look like a 3x3 matrix again
}
cout << values << endl; //prints the CVS to see that it looks like it did before piping it over to the C++ code
/* how the printed string looks like
3,7,9
1,7,0
4,12,8 */
/* Here I want to load the "values" into the Mat img
so I can do my mojo with openCV in C++ */
}
如果有人能帮助我解决这个问题并给我一个简单的代码示例,我将不胜感激。 如果有更好的方法将 np.array 通过管道传输到 C++ 代码并将其加载到 cv::Mat 中,我将为您张开双臂! ;-)
csv 文件的每一行代表一行。如果您的图像是 1 个通道,则每个值都是像素的灰度值:
1,2,3
4,5,6
7,8,9
生成的 3x3 1 通道图像为:
如果您的图像是 3 通道,则每行中的 3 个连续值代表一个 bgr 三元组。例如:
1,2,3,200,100,200
4,5,6,47,205,103
7,8,9,95,23,209
生成 3x2 3 通道图像:
loadFromCSV
函数接受csv内容的字符串,和OpenCV图像类型,returns图像:
Mat loadFromCSV(const string& values, int opencv_type);
查看完整代码:
#include <opencv2\opencv.hpp>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
using namespace cv;
Mat loadFromCSV(const string& values, int opencv_type)
{
Mat m;
stringstream ss(values);
string line;
while (getline(ss, line))
{
vector<double> dvals;
stringstream ssline(line);
string val;
while (getline(ssline, val, ','))
{
dvals.push_back(stod(val));
}
Mat mline(dvals, true);
transpose(mline, mline);
m.push_back(mline);
}
int ch = CV_MAT_CN(opencv_type);
m = m.reshape(ch);
m.convertTo(m, opencv_type);
return m;
}
int main()
{
string values = "1,2,3\n4,5,6\n7,8,9";
Mat img = loadFromCSV(values, CV_8UC1);
//Mat img = loadFromCSV(values, CV_8UC3);
//string values = "1,2,3,200,100,200\n4,5,6,47,205,103\n7,8,9,95,23,209";
//Mat img = loadFromCSV(values, CV_8UC3);
cout << "Img:" << endl;
cout << img << endl;
imshow("Img", img);
waitKey();
return 0;
}