2012-09-09 11 views
20

सी ++ इंटरफेस में ओपनसीवी में, यह छवि के प्रकार की जांच करने के लिए काफी आसान लगता है। यदि आपके पास एक छवि cv::Mat img = cv::imread("someImage.xyz") है, तो आप बस int theType = img.type() करें।ओपनसीवी छवि प्रकारों के enum नाम (उदा। CV_32FC1) प्राप्त करना?

हालांकि, जैसा कि आप उम्मीद करेंगे, img.type() पर कॉल करने से सिर्फ एक पूर्णांक, एक enum नाम नहीं है (उदा। CV_32FC1)।

अगर मुझे ओपनसीवी एनम का पूर्णांक मूल्य पता है तो enum name (उदा। CV_32FC1) मुद्रित करने का कोई आसान तरीका है?

+0

उन लोगों के लिए जो सीयूडीए से परिचित होने के लिए, ओपनसीवी फ़ंक्शन जिसे मैं ढूंढ रहा हूं वह CUDA में 'cudaGetErrorString (int)' फ़ंक्शन जैसा है। – solvingPuzzles

उत्तर

30

मेरे ज्ञान के लिए, ऐसा फ़ंक्शन ओपनसीवी में मौजूद नहीं है।

मुझे लगता है कि आप उन्हें प्राप्त करने के लिए अपना स्वयं का कार्य लिखना बेहतर होगा। बहुत सारे स्विच केस हैं लेकिन मुझे लगता है कि यह नौकरी करता है। गणना here पाया जा सकता है।

संपादित करें:

यह कुछ आप प्रकार को निकालने के लिए इस्तेमाल कर सकते हैं है। मुझे लगता है कि एक और अधिक कुशल विधि हो सकती है, लेकिन मैं अभी इसके चारों ओर अपने सिर को लपेट नहीं सकता।

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

इनट्स का उपयोग करने के बजाय (जो उस समय सही थे जब आपने उन्हें अपने विशेष निर्माण पर चेक किया था) आपको स्वयं को enums का उपयोग करना चाहिए। 'मामला 8 यू: str = "8U" 'तो आप निश्चित रूप से उन्हें सही तरीके से प्राप्त करना सुनिश्चित कर सकते हैं यदि enums एक अलग निर्माण में बदल जाते हैं। – 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"; 
} 

क्या मैं अपनी लुकअप टेबल में कोई ओपनसीवी छवि प्रकार शामिल करना भूल गया?

+0

हालांकि आपको दो चीजों को नोटिस करना होगा। सबसे पहले, वहां कोई मामला नहीं है जहां आपके पास शून्य चैनल हैं, हमेशा कम से कम 1 चैनल होता है, जिसका वास्तव में अर्थ है कि CV_8U = CV_8UC1 आदि। और दूसरा, आपके पास CV_CN_MAX चैनल हो सकते हैं जो 2.4.2 दस्तावेज़ों के अनुसार सेट है 512, इसलिए आप इस तरह से 4 चैनलों तक सीमित हैं। मैंने कुछ लिखा, मेरा संपादन देखें, बस इसे जांचना सुनिश्चित करें क्योंकि मैंने इसे संकलित नहीं किया था। – Sassa

+0

@ बॉब क्या आप सुनिश्चित हैं कि 5 से 512 पिक्सेल के लिए एनम लागू किए गए हैं? कंपाइलर का कहना है कि सीवी_8 यूसी 5 परिभाषित नहीं है। – solvingPuzzles

+0

वे # परिभाषित नहीं हैं, लेकिन वे CV_MAKETYPE का उपयोग कर व्युत्पन्न हैं, उदा। CV_MAKETYPE (CV_32F, 5); बेशक यदि आप इतने सारे चैनलों का उपयोग करने की योजना नहीं बनाते हैं, तो आप अपने फ़ंक्शन का उपयोग कर सकते हैं, केवल सीवी_8 यू इत्यादि को हटा दें क्योंकि वे सीवी_8 यूसी 1 आदि – Sassa

संबंधित मुद्दे