2012-12-11 18 views
5

मैं इन सवालों के जवाब नहीं मिल सकता है:ओपनसीवी में 16 बिट ग्रेस्केल के साथ कैसे काम करें?

  1. मैं OpenCV का उपयोग कर सकते 16-बिट ग्रेस्केल चित्रों को प्रदर्शित करने? मैंने imshow() की कोशिश की लेकिन ओपनसीवी द्वारा बनाई गई विंडो पर कुछ भी दिखाई नहीं दिया।

  2. मैं 16-बिट ग्रेस्केल चित्र को बी 5 जी 6 आर 5 तस्वीर में कैसे परिवर्तित कर सकता हूं? इस संरचना को स्टोर करने के लिए मुझे किस पैरामीटर को cv::Mat बनाना चाहिए? मैंने cv::cvtColor(m_cvTmp, tmp, CV_GRAY2BGR565) की कोशिश की लेकिन यह फ़ंक्शन क्रैश हो रहा था। documentation on miscellaneous image transformations उत्तर नहीं बताता है।

पीएस: जिस छवि को मैं संसाधित करना चाहता हूं वह पहले ही स्मृति में है।

+0

सुनिश्चित करें कि आप 'imshow' के बाद' waitKey 'पर कॉल करें। 'WaitKey' को छोड़ने के लिए कुछ भी नहीं होने का एक कारण होगा। – SSteve

+0

मैंने प्रतीक्षाकी का उपयोग किया, और खिड़की वहां खाली थी लेकिन खाली थी। – LeOpArD

+0

आपको शायद यह नहीं कहा जाना चाहिए "स्क्रीन पर कुछ भी नहीं दिखाई दिया"। यह "स्क्रीन पर एक खाली खिड़की दिखाई देने" से अलग है। आपके प्रश्नों में बेहतर विवरण, आपको एक उपयोगी उत्तर प्राप्त करने का बेहतर मौका मिलेगा। – SSteve

उत्तर

0

1) आपको इस documentation पर एक नज़र डालना है।

आपका कोड किया जाएगा:

Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE); 

2)

Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE); 
Mat imageBGR; 
cvtColor(imageGrey, imageBGR, CV_GRAY2BGR565); 

यह काम करता है करता है?

+0

यह उल्लेख करना भूल जाएं कि जिस छवि को मैं प्रसंस्करण कर रहा हूं वह पहले से ही स्मृति में है (किसी अन्य lib से)। मैंने एक सीवी :: मैट बनाया है जो इसके आंतरिक प्रतिनिधित्व के अनुरूप है और फिर डेटा को याद करता है। – LeOpArD

1

imshow के लिए प्रलेखन के अनुसार, यह स्क्रीन पर प्रदर्शित करने के लिए स्वचालित रूप से 16-बिट ग्रेस्केल को 8-बिट तक स्केल करेगा। मैंने निम्न प्रोग्राम के साथ इसका परीक्षण किया:

#include <iostream> 

#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 

using namespace std; 

int main(int argc, char *argv[]) { 
    cv::Mat image; 
    image = cv::imread("pic2.jpg"); 

    if (!image.data) { 
     std::cout << "Image file not found\n"; 
     return 1; 
    } 

    cv::cvtColor(image, image, CV_BGR2GRAY); 
    cv::Mat pic16bit; 
    image.convertTo(pic16bit, CV_16U, 255); //convert to 16-bit by multiplying all values by 255 

    // create image window named "asdfasdf" 
    cv::namedWindow("asdfasdf"); 
    // show the image on window 
    cv::imshow("asdfasdf", pic16bit); 
    // wait for key 
    cv::waitKey(0); 

    return 0; 
} 

यह ग्रेस्केल छवि को अपेक्षित रूप से प्रदर्शित करता है। तो अगर आपको बस एक खाली खिड़की मिल रही है, तो मेरा अनुमान है कि अन्य लाइब्रेरी से सीवी :: मैट में आपका रूपांतरण सही ढंग से काम नहीं कर रहा है। उदाहरण के लिए, जब मैंने पहली बार 8-बिट से 16-बिट में कनवर्ट करने की कोशिश की तो मुझे एक सभी काले छवि मिली क्योंकि मैं सभी 8-बिट मानों को 255 तक गुणा करना भूल गया था।

डीबगिंग में पहला कदम होगा अपने 16-बिट ग्रेस्केल सीवी :: मैट में कुछ या सभी मान प्रदर्शित करने का प्रयास करें।

साथ ही, सामान्य नियम के रूप में स्टैक ओवरफ़्लो सबसे अच्छा काम करता है यदि आपके प्रश्न में केवल एक प्रश्न है। जब कई प्रश्न हैं तो आप एक से अधिक वैध उत्तर के साथ हवादार हो जाएंगे, लेकिन आप उनमें से केवल एक को स्वीकार कर सकते हैं।

+0

धन्यवाद। मैं अगली बार अपने सवालों को अलग कर दूंगा। – LeOpArD

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