Доступ к пикселям кадра камеры в OpenCV Android

0

У меня есть следующий код c++, который обращается к пикселям в IplImage. Здесь он имеет свойство imageData в IplImage. Я хочу преобразовать следующий код в OpenCV Android.

IplImage *imageIn = cvLoadImage(strFileImage, CV_LOAD_IMAGE_UNCHANGED);
IplImage *imageShirtHSV = cvCreateImage(cvGetSize(imageShirt), 8, 3);
cvCvtColor(imageShirt, imageShirtHSV, CV_BGR2HSV);

int h = imageShirtHSV->height;              
int w = imageShirtHSV->width;           
int rowSize = imageShirtHSV->widthStep; 
char *imOfs = imageShirtHSV->imageData;

for (int y=0; y<h; y++) {
    for (int x=0; x<w; x++) {
        // Get the HSV pixel components
        uchar H = *(uchar*)(imOfs + y*rowSize + x*3 + 0);   // Hue
        uchar S = *(uchar*)(imOfs + y*rowSize + x*3 + 1);   // Saturation
        uchar V = *(uchar*)(imOfs + y*rowSize + x*3 + 2);   // Value (Brightness)
    }
}

Вот как я преобразовал вышеуказанный код c++ в OpenCV Android. Я использовал double[] pixels = imageShirtHSV.get(y, x); как эквивалент char *imOfs = imageShirtHSV->imageData; в c++. Но следующий код дает исключение ArrayIndexOutOfBoundsException, когда я получаю доступ к значениям HSV в массиве double [] пикселей.

imageIn = inputFrame.rgba();
Imgproc.cvtColor(imageIn, imageShirtHSV, Imgproc.COLOR_BGR2HSV);

int h = imageShirtHSV.height(); 
int w = imageShirtHSV.width();  
int rowSize = (int)imageShirtHSV.step1();   

for (int y=0; y<h; y++) {
    for (int x=0; x<w; x++) {
        double[] pixels = imageShirtHSV.get(y, x);

        int hVal = (int)pixels[(y*rowSize) + (x) + 0];  // Hue
        int sVal = (int)pixels[(y*rowSize) + (x) + 1];  // Saturation
        int vVal = (int)pixels[(y*rowSize) + (x) + 2];  // Value (Brightness)
    }
}

Может ли кто-нибудь указать мне, как я могу преобразовать символ c++ char *imOfs = imageShirtHSV->imageData; line к коду OpenCV Android. Большое спасибо.

Теги:
opencv
image-processing

1 ответ

2
Лучший ответ

это:

double[] pixels = imageShirtHSV.get(y, x);

дает вам только один пиксель. вы не можете адресовать соседние значения.

вместо этого выделите массив для хранения всех из них и получите доступ к этому: (это также намного быстрее!)

int h = imageShirtHSV.height(); 
int rowSize = (int)imageShirtHSV.step1();   
byte[] pixels = new byte[h*rowSize];
imageShirtHSV.get(0,0,pixels);

for (int y=0; y<h; y++) {
    for (int x=0; x<w; x++) {
        int hVal = (int)pixels[(y*rowSize) + (x) + 0];  // Hue
        int sVal = (int)pixels[(y*rowSize) + (x) + 1];  // Saturation
        int vVal = (int)pixels[(y*rowSize) + (x) + 2];  // Value (Brightness)
    }
}
  • 0
    Большое спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню