使用JavaCV API访问Mat的像素值

我最近从OpenCV C API切换到JavaCV,我正在尝试执行基本操作,例如迭代Mat.我正在尝试访问Mat的像素值,但我似乎无法找到方法,而JavaCV项目缺少文档.使用OpenCV C API,我曾经使用.at()方法访问Mat的像素值.

Mat加载为CV_8UC1 Mat(灰度),如下面的代码所示,我想打印/使用像素的0-255值.

    Mat image = imread("images/Text00.png", CV_8UC1);

    // Make sure it was successfully loaded.
    if (image == null) {
        System.out.println("Image not found!");
        System.exit(1);
    }

    System.out.println(image.rows());
    System.out.println(image.cols());

    for (int y = 0; y < image.rows(); y++) {

        for (int x = 0; x < image.cols(); x++) {

            // How to print the 0 to 255 value of each pixel in the Mat image.
        }
    }

类似但不适用的答案:

> How to iterate through a cvMat matrix in JavaCV?(过时,适用于CvMat)

解决方法:

关于这个,seemingly unrelated thread在JavaCV GitHub的讨论中,我在谷歌搜索一天后找到了我的问题的答案.请注意,可能有其他更有效的方法来做到这一点,但这是我目前发现的唯一方法.
解决方案由JavaCV提供的新“索引器”包表示(有关详细信息,请参阅thisthis).

它的用法非常简单:在声明像DoubleIndexer idx = Mat.createIndexer()之后,你可以调用idx.get(i,j)来更容易地获取矩阵的元素.

这是我更新的代码(你可以看到,我使用了UByteBufferIndexer,因为我的Mat是CV_8UC1 Mat):

    Mat image = imread("images/Text00.png", CV_8UC1);

    // Make sure it was successfully loaded.
    if (image == null) {
        System.out.println("Image not found!");
        System.exit(1);
    }

    UByteBufferIndexer sI = image.createIndexer();

    for (int y = 0; y < image.rows(); y++) {

        for (int x = 0; x < image.cols(); x++) {

            System.out.println( sI.get(y, x) );
        }
    }
上一篇:UnsatisfiedLinkError在Mac上的Eclipse中使用JavaCV


下一篇:从byte []加载Image OpenCV(JavaCV)而不是文件