我在csv文件中有图像,我想在我的程序中加载它。我发现我可以从这样的cvs加载图像:
CvMLData mlData;
mlData.read_csv(argv[1]);
const CvMat* tmp = mlData.get_values();
cv::Mat img(tmp, true),img1;
img.convertTo(img, CV_8UC3);
cv::namedWindow("img");
cv::imshow("img", img);
我在该文件中有RGB图片但是我得到了灰色图片...有人可以解释我如何加载彩色图像或者如何修改此代码以获得彩色图像? 谢谢!
答案 0 :(得分:0)
<强>更新强>
好的,我暂时不知道如何将您的文件读入OpenCV,但我可以为您提供解决方案以帮助您入门。以下内容将为PNM
格式文件创建一个标题以匹配您的CSV文件,然后将数据附加到最后,您应该最终得到一个可以加载的文件。
printf "P3\n284 177\n255\n" > a.pnm # Create PNM header
tr -d ',][' < izlaz.csv >> a.pnm # Append CSV data, after removing commas and []
如果我这样做,我可以看到你的长凳,树和河。
如果您无法将PNM
文件直接读入OpenCV,您可以使用ImageMagick将其制作成JPEG格式:
convert a.pnm a.jpg
我还看了一下威斯康星大学ML数据档案,用你正在使用的那些OpenCV函数阅读,他们的数据格式与你的不同......他们是这样的:
1000025,5,1,1,1,2,1,3,1,1,2
1002945,5,4,4,5,7,10,3,2,1,2
1015425,3,1,1,1,2,2,3,1,1,2
1016277,6,8,8,1,3,4,3,7,1,2
你的看起来像这样:
[201, 191, 157, 201 ... ]
因此,这个tr
命令可能足以转换您的数据:
tr -d '][' < izlaz.csv > TryMe.csv
原始答案
如果您在CSV文件上运行以下内容,它会将逗号转换为换行符,然后对行进行计数:
tr "," "\n" < izlaz.csv | wc -l
这会产生150,804行,这意味着文件中有150,804个逗号,因此文件中有150,804个整数(+/- 1或2)。如果您的灰度图像是177行乘852列,则需要150,804个RGB三元组(即450,000 +/-整数)来表示彩色图像,因为每个像素只有一个灰度值。
错误在于您编写文件的方式,而不是您阅读文件的方式。
答案 1 :(得分:0)
要查看彩色图像,我必须设置通道数。所以这段代码对我有用:
CvMLData mlData;
mlData.read_csv(argv[1]);
const CvMat* tmp = mlData.get_values();
cv::Mat img(tmp, true),img1;
img.convertTo(img, CV_8UC3);
img= img.reshape(3); //set number of channels