2012-12-11 9 views
5

Non riesco a trovare le risposte alle seguenti domande:Come lavorare con la scala di grigi a 16 bit in OpenCV?

  1. Posso usare OpenCV per visualizzare immagini a 16 bit in scala di grigi? Ho provato imshow() ma non è apparso nulla sulle finestre create da OpenCV.

  2. Come è possibile convertire un'immagine a 16 bit in scala di grigi in un'immagine B5G6R5? Quale parametro dovrei creare con cv::Mat per poter archiviare questa struttura? Ho provato cv::cvtColor(m_cvTmp, tmp, CV_GRAY2BGR565) ma questa funzione continuava a bloccarsi. Il documentation on miscellaneous image transformations non dice la risposta.

PS: l'immagine che voglio processo è già in memoria.

+0

Assicurati di mettere una chiamata a 'waitKey' dopo' imshow'. Omettere 'waitKey' sarebbe una delle ragioni per cui non dovrebbe comparire nulla. – SSteve

+0

Ho usato waitKey e la finestra era lì, ma vuota. – LeOpArD

+0

Probabilmente non avresti dovuto dire "niente è apparso sullo schermo". È diverso da "una schermata vuota è apparso sullo schermo". Migliori sono i dettagli delle tue domande, maggiori saranno le possibilità di ottenere una risposta utile. – SSteve

risposta

0

1) Dare un'occhiata a questo documentation.

Il codice sarà come:

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

funziona?

+0

Dimentica di menzionare che l'immagine che sto elaborando è già in memoria (da un'altra libreria). Ho creato un cv :: Mat conforme alla sua rappresentazione interna e quindi memcpy i dati. – LeOpArD

1

Secondo la documentazione per imshow, ridimensionerà automaticamente una scala di grigi a 16 bit a 8 bit per visualizzarlo sullo schermo. Ho provato questo con il seguente programma:

#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; 
} 

E 'visualizzata l'immagine in scala di grigi come previsto. Quindi, se stai ottenendo una finestra vuota, suppongo che la conversione dall'altra libreria a cv :: Mat non funzioni correttamente. Ad esempio, quando ho provato a convertire da 8 bit a 16 bit ho ottenuto un'immagine tutto nero perché ho dimenticato di moltiplicare tutti i valori di 8 bit per 255.

Come primo passo nel debug prova a visualizzare alcuni o tutti i valori nella scala di grigi a 16 bit cv :: Mat.

Inoltre, come regola generale, Stack Overflow funziona meglio se nella domanda è presente una sola domanda. Quando ci sono più domande si finisce con più di una risposta valida, ma è possibile accettarne solo una.

+0

Grazie. La prossima volta separerò le mie domande. – LeOpArD

Problemi correlati