Jestem początkującym użytkownikiem OpenCV dla JAVA. Chcę uzyskać dostęp do indywidualnych wartości pikseli macierzy obrazów. Ponieważ jar JAVA dla OpenCV nie oferuje ładnych funkcji, takich jak C++, wpadłem w kłopoty. Po wielu poszukiwaniach odkryłem dwie różne metody, które nie zostały wyjaśnione w odpowiedni sposób (nawet w dokumentacji). Możemy to zrobić za pomocą funkcji get() i put() lub konwertując dane maty na typ prymitywny Java, taki jak tablice. Próbowałem obu, ale uzyskując różne wyniki wyjściowe! Pomóż wyjaśnić, co robię źle. Czy używam ich źle, czy też jakiegoś innego głupiego problemu. Nadal jestem nowicjuszem, więc proszę wybacz, jeśli to głupie pytanie. :)Używanie get() i put() do uzyskiwania dostępu do wartości pikseli w OpenCV dla Javy
Przypadek 1: Korzystanie z get() funkcja
Mat A = Highgui.imread(image_addr); \\"image_addr" is the address of the image
Mat C = A.clone();
Size sizeA = A.size();
for (int i = 0; i < sizeA.height; i++)
for (int j = 0; j < sizeA.width; j++) {
double[] data = A.get(i, j);
data[0] = data[0]/2;
data[1] = data[1]/2;
data[2] = data[2]/2;
C.put(i, j, data);
}
Przypadek 2: Korzystanie Array
Mat A = Highgui.imread(image_addr); \\"image_addr" is the address of the image
Mat C = A.clone();
int size = (int) (A.total() * A.channels());
byte[] temp = new byte[size];
A.get(0, 0, temp);
for (int i = 0; i < size; i++)
temp[i] = (byte) (temp[i]/2);
C.put(0, 0, temp);
Teraz według mojego rozeznania powinien oba robią to samo. Obaj uzyskują dostęp do poszczególnych wartości pikseli (wszystkie 3 kanały) i robią to w połowie. Po uruchomieniu nie pojawia się żaden błąd. Ale wyjściowy obraz, który otrzymuję, jest inny w tych dwóch przypadkach. Czy ktoś może wyjaśnić, na czym polega problem? Być może nie rozumiem dokładnie, jak działa funkcja get()? Czy to z powodu odlewania bajtów()? Proszę pomóż.
Dzięki!
dzięki za dobre pytanie, czy możesz wyjaśnić, dlaczego użyłeś: (A.total() * A.channels()); ?? suma (metoda zwraca wysokość withd *, dlaczego jest pomnożona przez numery kanałów, wiem, że obraz RGB ma 3 kanały ... ale potrzebuję więcej wyjaśnienia proszę – rmaik
@rmaik Każdy kanał ma własne wartości intensywności (czerwony, niebieski lub zielony) dla każdego piksela, więc całkowita liczba tych wartości intensywności w obrazie jest równa liczbie pikseli * całkowita liczba kanałów. Tak więc w tym przypadku total() daje całkowitą liczbę pikseli w obrazie i kanale() daje liczbę kanałów – gargsl