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 であり、同じイメージに対して、C++ コードと Java コードで matimg.step と matimg.elemSize() の値が異なります。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 に答える