gpt4 book ai didi

java - HSV 中的 OpenCV 颜色分析

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:03 26 4
gpt4 key购买 nike

正如标题所示,我有兴趣使用 java CV 获取特定像素的 HSV 值。这听起来很简单,而且在 C++ 或 Python 中似乎很简单,但我就是不知道如何在 Java 中做到这一点。我对 OpenCV 还很陌生,如果我决定使用这个库做更多项目,我肯定会用 C++ 或 Python 编写它们。

作为引用,我的目标是对具有不同照明级别的对象进行颜色分析。最终目标是能够拍摄 T 恤之类的图像,并能够说“这件 T 恤是 x% 红色”。

这是我使用的一些代码。令人惊讶的是,inRange() 比循环遍历每个像素并逐一获取 RGB 花费的时间要长得多。我希望能够仅使用 HSV 色彩空间来做到这一点。如果您知道实现此目标的更好方法,请告诉我,因为这毁了我整个星期六。谢谢!

        Scalar min = new Scalar(22,11,3);
Scalar max = new Scalar(103,87,74);
int sum = 0;

System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
File input = new File("bluesample.jpg");
BufferedImage image = ImageIO.read(input);

byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC3);

mat.put(0, 0, data);

Core.inRange(mat, min, max, mat1);
System.out.println(mat1.total());
System.out.println(mat1.total());

for (int i=0;i<mat1.rows(); i++ ){
for (int j=0;i<mat1.cols();j++){
sum += mat1.get(j, i, data);
}
}

System.out.println(sum/mat1.total());

编辑:

try { System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); 
File input = new File("singlehsvpix.jpg");
BufferedImage image = ImageIO.read(input);

byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, data);

Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC1);
Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2HSV);
System.out.println(mat1.dump());
byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())];
mat1.get(0, 0, data1);
//BufferedImage image1 = new BufferedImage(mat1.cols(),mat1.rows(), BufferedImage.TYPE_BYTE_GRAY);
BufferedImage image1 = new BufferedImage(mat1.cols(),mat1.rows(), 5);
image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1);

File output = new File("PLS!.jpg");
ImageIO.write(image1, "jpg", output);
System.out.println(mat1.get(0, 0, data1)); // RELEVANT LINE
System.out.println("Done");

} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}

正在打印:

[ 54, 213, 193]
3
Done

对于这张图片,54、213、193 是 BGR 值...我想我对 OpenCV 的了解不够,不知道为什么我的 mat1.get 打印 3

最佳答案

所以,你想将 rgb 转换为 hsv。

Imgproc.cvtColor(im_rgb, im_hsv, Imgproc.COLOR_RGB2HSV);

然后,根据需要进行处理

编辑:在代码中,将 ma​​t 更改为 ma​​t1

for (int i=0;i<mat1.rows(); i++ ){ 
for (int j=0;i<mat1.cols();j++){
sum += mat.get(j, i, data); //this line
}
}
System.out.println(sum/mat1.total());

您正在将值添加到原始矩阵中。

关于java - HSV 中的 OpenCV 颜色分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com