2

我需要将下面的代码从 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;
    }
}

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

4

1 回答 1

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);
    }
}
于 2013-06-18T22:50:42.740 回答