2012-04-02 8 views
14

Poszukuję wydajnego sposobu edytowania/odczytu pikseli ze zmiennej Mat (lub Mat3b).Jak edytować/odczytać wartości pikseli w OpenCv ze zmiennej Mat?

użyłem: -

Image.at<Vec3b>(i,j) 

ale to wydaje się być bardzo powolne.

Kiedyś to również: -

A.data[A.channels()*A.cols*i + j + 0] 

ale problem jestem stoi z tym jest, gdy uruchomię tej pętli

for(i=0; j<A.rows; i++){ 
    for(j=0; j<A.cols; j++){ 
      A.data[A.channels()*A.cols*i + j + 0] = 0; 
      A.data[A.channels()*A.cols*i + j + 1] = 0; 
      A.data[A.channels()*A.cols*i + j + 2] = 0; 
    } 
} 

tylko część obrazu jest zaciemniony.

+0

Istnieją szybszy sposób, aby uzyskać dostęp elementy mat, jak przyjął odpowiedź słusznie, ale uruchomić program w trybie Release przyspieszy się wiele matę .at () uzyskuje dostęp. Będą one nieco wolniejsze niż dostęp do wskaźnika – Sam

Odpowiedz

18

Here można zobaczyć niektóre z możliwości szybkiego dostępu do elementów.

Ale jeśli chcesz to zrobić po swojemu, musisz dodać nawias. W przeciwnym razie obliczenia indeksu nie jest poprawna:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.channels()*(A.cols*i + j) + 0] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 1] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 2] = 0; 
    } 
} 

ale układ pamięci nie jest gwarantowana być ciągłe ze względu na dopełnienie. Więc według this należy raczej użyć formuły takiego:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.step[0]*i + A.step[1]* j + 0] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 1] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 2] = 0; 
    } 
} 
+0

A.data [A.step [0] * i + A.step [1] * j + 0] = 0; Ta linia daje błąd. –

+2

Użyłem A.data [A.step * i + A.channels() * j + 0], to działa poprawnie. Dzięki temu zajmuje znacznie mniej czasu niż poprzednia metoda. :) –

14

Jest to jeden z najbardziej wydajnych sposobów edycji/odczytu pikseli z cv :: Mat. Tworzenie wskaźnik do wiersza (z określonego kanału w razie potrzeby)

for(int i=0; i<A.rows;i++){ 
    uchar* rowi = A.ptr/*<uchar>*/(i); 
    for(int j=0; j<A.cols; j++){ 
    doProcessOnPixel(rowi[j]); 
    } 
} 
Powiązane problemy