我最近从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提供的新“索引器”包表示(有关详细信息,请参阅this和this).
它的用法非常简单:在声明像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) );
}
}