2015-06-08 213 views
1

我想導入到openCV(C++)的一個圖像。 使用命令imread它只顯示第一個樂隊。我怎樣才能訪問其他人?OpenCv多光譜圖像openCV

更多我試圖用ifstream訪問該文件,但它看起來像我犯了一些錯誤!

感謝您的幫助!

最好

+1

http://answers.opencv.org/question/23616/stack-of-images-tif-with-c-opencv/ – macroland

+0

看起來像是不可能在第一個之後加載圖像。 –

回答

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] 
+0

嘿,如果有一個龐大的樂隊(比如說1000),有什麼像VecNb? – CharybdeBE

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(); 
    } 
}