我正在尝试导入openCV(c ++)图像.TIF,它有几个波段。 使用命令imread它只显示第一个乐队。我如何访问其他人?
更多我尝试使用ifstream访问该文件,但看起来我犯了一些错误!
感谢您的帮助,!
最佳
答案 0 :(得分:2)
OpenCV目前不支持多页图像读取。它只会读取第一张图像。
对于C ++ .TIFF阅读,libtiff有很多例子。 Imagemagick也支持C ++。您可以读取图像并将数据缓冲区复制到OpenCV Mat。
以下是使用imagemagick的Magick ++例程的示例c ++代码:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
#include <Magick++.h>
#include <sstream>
#include <exception>
using namespace Magick;
using namespace std;
using namespace cv;
template < typename T > std::string to_string( const T& n )
{
std::ostringstream stm ;
stm << n ;
return stm.str() ;
}
vector <Mat> read_images( string filename, int num=1, string dpi="300" ) {
vector <Mat> ret;
Image image;
image.density(dpi);
int cols, rows;
int i = 0;
while( i < num ) {
cout << filename + "[" + to_string(i) + "]" << endl;
try {
image.read(filename + "[" + to_string(i) + "]");
}catch ( exception ex ) {
cout << "read " << i << " pages" << endl;
break;
}
i++;
cols = image.columns();
rows = image.rows();
char* blob = new char[cols*rows*3];
image.write(0,0, cols, rows, "RGB", MagickCore::CharPixel, blob);
ret.push_back(Mat(rows, cols, CV_8UC3, blob));
}
return ret;
}
int main ( int argc, char** argv ) {
vector<Mat> images = read_images(argv[1], 10);
for( int i = 0; i < images.size(); i++ ) {
imshow("image", images[i]);
waitKey();
}
}
答案 1 :(得分:0)
有些代码可以帮助您查看错误。
但是,您似乎只访问了第一个乐队,而不是您想要的所有乐队。
尝试这样的事情(这个例子有3个波段,因此Vec3b):
Vec3b image = imread(filePath, CV_LOAD_IMAGE_UNCHANGED);
这将图像存储在3波段矢量中(有几种类型具有不同的波段数量,如Vec4b或Vec5b)。然后,您可以像访问向量中的元素一样访问每个波段:
image[0]
image[1]
image[2]
如果我假设的是正确的,那么您试图通过使用
的内容来访问int bandValue = (int)image;
或类似的东西。请记住,引用向量(或数组)的名称与访问该向量(或数组)中的第一个元素相同
image = image[0]