2012-09-09 15 views
20

OpenCVへのC++インターフェイスでは、画像の種類を確認するのは簡単です。画像がcv::Mat img = cv::imread("someImage.xyz")の場合は、int theType = img.type()とするだけです。OpenCVイメージタイプの列挙型名(CV_32FC1など)を取得していますか?

しかし、期待通りに、img.type()を呼び出すと、列挙型ではなく整数型(例:CV_32FC1)になります。

OpenCV列挙型の整数値を知っていれば、列挙型名(例:CV_32FC1)を簡単に印刷できますか?

+0

CUDAに精通している人には、私が探しているOpenCV関数は、CUDAの 'cudaGetErrorString(int)'関数のようなものです。 – solvingPuzzles

答えて

30

私の知るところでは、このような機能はOpenCVには存在しません。

私はあなたが自分の関数を書いてそれらを得る方が良いと思います。多くのスイッチのケースが、私はそれが仕事をすると思います。列挙型はhereです。

EDITは:

これは、あなたがタイプを抽出するために使用できるものです。私はもっ​​と効率的な方法があると思っていますが、私はすぐにその頭を包むことができません。

std::string getImageType(int number) 
{ 
    // find type 
    int imgTypeInt = number%8; 
    std::string imgTypeString; 

    switch (imgTypeInt) 
    { 
     case 0: 
      imgTypeString = "8U"; 
      break; 
     case 1: 
      imgTypeString = "8S"; 
      break; 
     case 2: 
      imgTypeString = "16U"; 
      break; 
     case 3: 
      imgTypeString = "16S"; 
      break; 
     case 4: 
      imgTypeString = "32S"; 
      break; 
     case 5: 
      imgTypeString = "32F"; 
      break; 
     case 6: 
      imgTypeString = "64F"; 
      break; 
     default: 
      break; 
    } 

    // find channel 
    int channel = (number/8) + 1; 

    std::stringstream type; 
    type<<"CV_"<<imgTypeString<<"C"<<channel; 

    return type.str(); 
} 
+0

良い考え。私はあなたの提案に従って、これを行うためのコードを書きました。下の私の答えを見てください。 – solvingPuzzles

+0

ints(特定のビルドでチェックした時点で正しい)を使用するのではなく、enums自体を使用する必要があります。 'case 8U:str =" 8U "'別のビルドで列挙型が変更された場合は、それらを正しく取得することができます。 – Octopus

19

私はこの問題を解決するために独自の関数を書いていました。ここにあります:

// take number image type number (from cv::Mat.type()), get OpenCV's enum string. 
string getImgType(int imgTypeInt) 
{ 
    int numImgTypes = 35; // 7 base types, with five channel options each (none or C1, ..., C4) 

    int enum_ints[] =  {CV_8U, CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4, 
          CV_8S, CV_8SC1, CV_8SC2, CV_8SC3, CV_8SC4, 
          CV_16U, CV_16UC1, CV_16UC2, CV_16UC3, CV_16UC4, 
          CV_16S, CV_16SC1, CV_16SC2, CV_16SC3, CV_16SC4, 
          CV_32S, CV_32SC1, CV_32SC2, CV_32SC3, CV_32SC4, 
          CV_32F, CV_32FC1, CV_32FC2, CV_32FC3, CV_32FC4, 
          CV_64F, CV_64FC1, CV_64FC2, CV_64FC3, CV_64FC4}; 

    string enum_strings[] = {"CV_8U", "CV_8UC1", "CV_8UC2", "CV_8UC3", "CV_8UC4", 
          "CV_8S", "CV_8SC1", "CV_8SC2", "CV_8SC3", "CV_8SC4", 
          "CV_16U", "CV_16UC1", "CV_16UC2", "CV_16UC3", "CV_16UC4", 
          "CV_16S", "CV_16SC1", "CV_16SC2", "CV_16SC3", "CV_16SC4", 
          "CV_32S", "CV_32SC1", "CV_32SC2", "CV_32SC3", "CV_32SC4", 
          "CV_32F", "CV_32FC1", "CV_32FC2", "CV_32FC3", "CV_32FC4", 
          "CV_64F", "CV_64FC1", "CV_64FC2", "CV_64FC3", "CV_64FC4"}; 

    for(int i=0; i<numImgTypes; i++) 
    { 
     if(imgTypeInt == enum_ints[i]) return enum_strings[i]; 
    } 
    return "unknown image type"; 
} 

ルックアップテーブルにOpenCVイメージタイプを含めるのを忘れましたか?

+0

しかし、あなたは2つのことに気づく必要があります。最初に、チャンネルがゼロの場合はありません。常に少なくとも1つのチャンネルがあります。実際にはCV_8U = CV_8UC1などです。また、2.4.2のドキュメントに基づいてCV_CN_MAXまでのチャンネルを持つことができます512のように、あなたはこのように4チャンネルに自分自身を制限しています。私は何かを書いた、私の編集を見て、私はそれをコンパイルしなかったので、それをテストすることを確認してください。 – Sassa

+0

@Bob 5〜512ピクセルの列挙型が実装されていると確信していますか?コンパイラは、CV_8UC5は定義されていないと言います。 – solvingPuzzles

+0

これらは#定義されていませんが、CV_MAKETYPE、たとえばCV_MAKETYPE(CV_32F、5)を使用して派生しています。もちろん、CV_8UC1などのCV_8UC1などと同じ結果を返すようなCV_8Uなどを削除するだけで、たくさんのチャンネルを使用する予定がない場合は、関数を使用できます。 – Sassa

関連する問題