2013-05-29 14 views
6

Chcę przetestować funkcję, która szuka dla określonej głębokości mat & & liczbę kanałówUstawianie głębokości do cv :: Mat

To test ...

if (image.channels() == 1 && image.depth() == 8) ... 
else if (image.channels() == 1 && image.depth() == 16) ... 
else if (image.channels() == 1 && image.depth() == 32) ... 
else 
{ 
    if ((image.channels() != 3) || (image.depth() != 8)) 
    {printf("Expecting rgb24 input image"); return false;} 
    ... 
} 

Wolę przetestować z konfekcjonowanego maty, aby uniknąć wykorzystania lokalnych zasobów:

cv::Mat M(255, 255, CV_8UC3, cv::Scalar(0,0,255)); 
printf("M: %d %d \n", M.channels(), M.depth()); 
cv::Mat M1(255, 255, CV_32F, cv::Scalar(0,0,255)); 
cv::Mat M2(255, 255, CV_32FC3, cv::Scalar(0,0,255)); 
cv::Mat M2(255, 255, CV_8SC3, cv::Scalar(0,0,255)); 

I eksperymentowali z różnego rodzaju kombinacji, ale jeśli mogę wydrukować, otrzymuję 0 głębię.

Próbowałem również załadować plik PNG lub jpg - z tego samego rezultatu (wolę nie używać plików zewnętrznych ... ale nie widzę powodu, dlaczego to nie działa)

cv::Mat M3 = cv::imread("c:/my_image.png", CV_LOAD_IMAGE_COLOR); 
cv::Mat M3 = cv::imread("c:/my_image.jpg", CV_LOAD_IMAGE_COLOR); 

Wszystkie wydają się mieć głębokość = 0?

Czy jest coś jeszcze, co muszę zrobić? Nie widzę nic w dokumentacji ...

Dziękuję

Odpowiedz

9

Po wywołaniu głębokość (na macie), zwraca wartości głębokości, jak zdefiniowano poniżej zamiast liczby bitów:

#define CV_8U 0 
#define CV_8S 1 
#define CV_16U 2 
#define CV_16S 3 
#define CV_32S 4 
#define CV_32F 5 
#define CV_64F 6 

Możesz użyć wartości cv :: DataDepth :: value, aby dowiedzieć się, który jest który. Na przykład,

cv::DataDepth<unsigned char>::value == CV_8U; 
cv::DataDepth<float>::value == CV_32F; 

więc powinieneś dostać 0 na całej matrycy CV_8UCX, a po załadowaniu obrazu, jest on zazwyczaj ładowane jako CV_8UC3, więc dostaniesz 0, jak również. Ale nie jestem pewien, dlaczego masz 0 na cv :: Mat M (255, 255, CV_32FC3), przetestowałem go na moim komputerze, wrócił 5.

+0

Więc ... test w funkcji jest wtedy błędny. .. Zmieniłem go z wersji c tam, gdzie było (image-> nChannels == 1 && image-> depth == 8) i tak na – Thalia

+0

tak, interfejs C++ jest inny, oto najnowsza dokumentacja na temat głębi (): http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-depth – cxyzs7