使用JavaCV API获取Mat的像素值访问

4

我最近从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.
        }
    }

类似但不可应用的答案:

1个回答

9
在JavaCV的Github讨论中,我在搜索了一天后,在这个似乎不相关的帖子中找到了答案。请注意,可能有其他更有效的方法来解决这个问题,但目前我只发现了这种方法。 解决方案由JavaCV提供的新"indexer" package表示(更多详细信息请参见此处此处)。
它的使用非常简单:声明类似于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) );
        }
    }

2
这里显示Exception in thread "main" java.lang.ClassCastException: org.bytedeco.javacpp.indexer.UByteRawIndexer cannot be cast to org.bytedeco.javacpp.indexer.UByteBufferIndexer,但是将 UByteBufferIndexer 更改为 UByteRawIndexer 后,它可以正常工作。谢谢! - MewX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接