从JavaCV中的IplImage获取数组

时间:2013-06-18 11:54:41

标签: opencv javacv

我需要将下面的代码从C ++转换为Java。在C ++中我使用openCV,我需要使用JavaCV在Java中进行转换。

IplImage* img = cvLoadImage(argv[0]);
int rows = img->height;
int cols = img->width;

Mat matimg(img);
vector<vector<double> > img_vec(rows, vector<double>(cols));

for (int i=0; i < rows; i++) {
    for (int j =0; j < cols; j++){
        unsigned char temp;
        temp = ((uchar*) matimg.data + i * matimg.step)[j  * matimg.elemSize() + 1 ];
        img_vec[i][j] = (double) temp;
    }
}

我尝试过以下转换为java,但它无法正常工作。我打印了temp的值,它一直是0,对于相同的行为,matimg.step和matimg.elemSize()的值在C ++代码和Java代码中是不同的。 在c ++中,我得到matimg.step = 2400和matimg.elemSize()= 3而在Java中我得到3000和1。

以下是java中的代码:

IplImage img = cvLoadImage(argv[0]);
int rows = img.height();
int cols = img.width();

CvMat matimg = img.asCvMat();
double img_vec[][] = new double[rows][cols];
for (int i=0; i < rows; i++) {
    for (int j =0; j < cols; j++){
         short temp;
         temp = matimg.data_s().get(i * matimg.step() + j  * matimg.elemSize() + 1);
         img_vec[i][j] = (double) temp;
    }
}

我不明白我在哪里做错了? 任何帮助表示赞赏, 感谢。

1 个答案:

答案 0 :(得分:3)

我用这个解决了我的问题:

ByteBuffer buffer = img.getByteBuffer();
double img_vec[][] = new double[rows][cols];
for (int i=0; i < rows; i++) {
    for (int j =0; j < cols; j++){
        int ind = i * img.widthStep() + j * img.nChannels() + 1;
        img_vec[i][j] = (buffer.get(ind) & 0xFF);
    }
}