2012-12-11 10 views
5

nie mogę znaleźć odpowiedzi na te pytania:Jak pracować z 16-bitową skalą szarości w OpenCV?

  1. mogę używać OpenCV wyświetlanie 16-bitowej skali szarości zdjęcia? Próbowałem imshow(), ale nic nie pojawiło się w oknach utworzonych przez OpenCV.

  2. Jak mogę przekonwertować 16-bitowy obraz w skali szarości na obraz B5G6R5? Z jakiego parametru należy utworzyć cv::Mat, aby zachować tę strukturę? Próbowałem cv::cvtColor(m_cvTmp, tmp, CV_GRAY2BGR565), ale ta funkcja ciągle się zawiesza. documentation on miscellaneous image transformations nie podaje odpowiedzi.

PS: obraz, który chcę przetworzyć, jest już w pamięci.

+0

Upewnij się, że wywołałeś 'waitKey' po' imshow'. Pominięcie 'waitKey' będzie jednym z powodów, dla których nic się nie pojawi. – SSteve

+0

Użyłem waitKey, a okno było puste. – LeOpArD

+0

Prawdopodobnie nie powinieneś był mówić "nic nie pojawiło się na ekranie". To różni się od "pustego okna pojawiającego się na ekranie". Im lepsze dane w pytaniach, tym większa szansa na uzyskanie przydatnej odpowiedzi. – SSteve

Odpowiedz

0

1) Musisz spojrzeć na to documentation.

Twój kod będzie jak:

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

Czy to działa?

+0

Nie zapomnij wspomnieć, że obraz, który przetwarzam, jest już w pamięci (z innej biblioteki). Stworzyłem cv :: Mat zgodny z jego wewnętrzną reprezentacją, a następnie zapamiętaj dane. – LeOpArD

1

Zgodnie z dokumentacją dla imshow, automatycznie przeskaluje 16-bitową skalę szarości do 8-bitowej, aby wyświetlić ją na ekranie. Testowałem to w następującym programie:

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

Wyświetlało obraz w skali szarości zgodnie z oczekiwaniami. Więc jeśli masz tylko puste okno, domyślam się, że konwersja z innej biblioteki na cv :: Mat nie działa poprawnie. Na przykład, kiedy po raz pierwszy próbowałam konwertować z 8-bitowego na 16-bitowy, otrzymałem cały czarny obraz, ponieważ zapomniałem pomnożyć wszystkie 8-bitowe wartości przez 255.

Jako pierwszy krok w debugowaniu spróbuj wyświetlić niektóre lub wszystkie wartości w 16-bitowej skali szarości cv :: Mat.

Co do zasady Stack Overflow działa najlepiej, jeśli masz tylko jedno pytanie w swoim pytaniu. W przypadku wielu pytań otrzymasz więcej niż jedną prawidłową odpowiedź, ale możesz zaakceptować tylko jedną z nich.

+0

Dziękuję. Swoje pytania podzielę następnym razem. – LeOpArD