2012-10-08 13 views

Odpowiedz

15

Zasada ogólna dla typenames matryc w OpenCV jest:

CV_<bit_depth>(S|U|F)C<number_of_channels> 

S = Signed integer 
U = Unsigned integer 
F = Float 

Więc w zależności od jednego z poprzednich listów (S, U, F) masz, będzie odlewania <int>, <unsigned integer> lub <float>.

+0

Proszę [czytaj] (http://stackoverflow.com/review-beta/suggested-edits/780994) zatwierdzane przez Ciebie recenzje. –

+1

W tym przypadku wolałbym na , ponieważ standard C++ nie określa rozmiaru bitowego typów integralnych –

+0

Nie ma typu CV_32U *, ale nadal możesz użyć 'X.at (i, j)' jeśli twoja macierz CV_32SC1 zawiera faktycznie niepodpisane wartości. – greggo

3

CV_32SC1 to 1 kanał podpisanej 32-bitowej liczby całkowitej, a następnie myślę, że powinien to zrobić X.at<int>().

Mata już "wie" jak adresować piksel, typ właśnie rzuca bity do wartości C++, której potrzebujesz do oceny wyrażenia.

Znalazłem here kilka wyjaśnień na temat notacji.

+0

Nie do końca prawda. z 'at ', adresowanie w kierunku x jest całkowicie oparte na rozmiarze T. Jeśli twoja macierz to CV_8UC3, to 'X.at (0,2)' dostaniesz trzeci piksel w pierwszym rzędzie; ale 'X.at (0,2 * 3 + 1)' da ci drugi kanał tego samego piksela (tj. ten sam bajt co 'X.at (0,2) [1]' Z tego powodu , wysokość w kierunku x jest oparta na stałej czasu kompilacji 'sizeof (T)' zamiast na wartości obliczonej z typu zapisanego w obiekcie Mat, co powoduje znaczną różnicę w wydajności. wielokanałowych routerów – greggo

Powiązane problemy