【问题标题】:OpenCV color analysis in HSVHSV 中的 OpenCV 颜色分析
【发布时间】:2015-09-12 20:40:37
【问题描述】:

正如标题所示,我有兴趣使用 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

【问题讨论】:

  • 我建议你不要写完整的代码,像我展示的那样写,找到你需要的,然后放异常,img.write 等。你的代码有很多不必要的东西

标签: java opencv hsv


【解决方案1】:

所以,您想将 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());

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

【讨论】:

  • 是的,这就是我将照片转换为 HSV 色彩空间时所做的事情。我的问题是,我怎样才能从那时起查看 HSV 值?我使用的所有方法都给了我 RGB 值。
  • 我不确定您的代码是否还有其他错误,但我写了一个我认为我看到的错误。如果有帮助,请编辑并告诉我。
  • 谢谢,这是一个我没有注意到的错误。但是,我遇到的问题确实与该代码无关。我只想能够打印一个像素的 HSV 值。我似乎找不到任何可以回答如何在 Java 中做到这一点的东西,因为所有文档和以前的问题都来自旧版本的 java ~2011
  • 也许我不是最新的,但我没有看到问题。只需使用第一个将原始矩阵转换为 hsv。然后,System.out.println(hsv_mat.get(i,j, k)) 将打印相应的点。如果k = 0会打印色调值,以此类推
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
相关资源
最近更新 更多