我一直在尝试在opencv java中转换一些opencv C ++代码,我似乎无法让像素分区正常工作。我拿了一个平均分段的垫子,我将其转换为灰度,然后转换为32F。
然后我将最下采样然后上采样的图像(由灰色的平移垫组成)与原始的灰色平移垫进行比较。
我已阅读Using get() and put() to access pixel values in OpenCV for Java
但是,它和其他人一样不行。我得到的错误消息是无效的垫子类型5.然而,即使我能够看到显着性图,我是肯定的,这是错误的。这是因为当我在c ++中传入图像001.jpg时,我应该看到原始图像+对象周围的红色方块。在java中,我只是在最后看到原始图像。注意:
AbstractImageProvider.deepCopy(AbstractImageProvider.matToBufferedImage(显着性),DISP);
当我尝试显示原始垫子,meanShift垫子和灰色meanShift垫子时,API调用是否有效。它没有表现出显着性。
C ++
我只进行了频道分割,因为我正在测试其他颜色空间,但是在java中我只想使用灰度。
'\r\n'
的java
#include <iostream>
using namespace std;
int main() {
int var{ 0 };
cout << "Bitte eine Ganzzahl eingeben: ";
if ((cin >> var) == false) {
cerr << "Falsche Eingabe - Keine Zahl\n";
exit(1);
}
system("pause");
//return 0;
}
答案 0 :(得分:2)
经过大量搜索后找到了一个简单而有效的解决方案。这可能有助于您超越错误 - 无效的垫类型5
<强>代码:强>
Mat img = Highgui.imread("Input.jpg"); //Reads image from the file system and puts into matrix
int rows = img.rows(); //Calculates number of rows
int cols = img.cols(); //Calculates number of columns
int ch = img.channels(); //Calculates number of channels (Grayscale: 1, RGB: 3, etc.)
for (int i=0; i<rows; i++)
{
for (int j=0; j<cols; j++)
{
double[] data = img.get(i, j); //Stores element in an array
for (int k = 0; k < ch; k++) //Runs for the available number of channels
{
data[k] = data[k] * 2; //Pixel modification done here
}
img.put(i, j, data); //Puts element back into matrix
}
}
Highgui.imwrite("Output.jpg", img); //Writes image back to the file system using values of the modified matrix
注意:在线任何地方都没有提及的重要一点是方法put
不会将像素写入Input.jpg
。它只是更新矩阵img
的值。因此,上述代码不会改变输入图像中的任何内容。为了产生可见输出,需要将矩阵img
写入文件,即Output.jpg
。此外,使用img.get(i, j)
似乎是处理矩阵元素的更好方法,而不是使用上面接受的解决方案,因为这有助于以更好的方式可视化和处理图像矩阵,并且不需要大的连续内存分配