2014-02-20 2 views
0

У меня есть следующий код C++, который обращается к пикселям в IplImage. Здесь он имеет свойство, называемое imageData в IplImage. Я хочу преобразовать следующий код в OpenCV Android.Доступ к пикселам камеры камеры в 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; строку в код OpenCV Android. Большое спасибо.

ответ

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

Большое спасибо. –

Смежные вопросы