正如标题所示,我有兴趣使用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
答案 0 :(得分:0)
因此,您希望将rgb转换为hsv。
Imgproc.cvtColor(im_rgb, im_hsv, Imgproc.COLOR_RGB2HSV);
然后,随意处理
修改:在您的代码中,将 mat 更改为 mat1
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());
您正在原始矩阵中添加值。