OpenCV Java,读取中心像素的 HSV 值

Posted

技术标签:

【中文标题】OpenCV Java,读取中心像素的 HSV 值【英文标题】:OpenCV Java, Read HSV Value of the center pixel 【发布时间】:2017-08-07 02:50:39 【问题描述】:

我似乎从下面的代码中获得了超过 3 个值,难道只假设有 3 个值,H、S 和 V?我做错了什么?

代码:

if (getIntent().hasExtra("byteArray")) 

            bitmap = BitmapFactory.decodeByteArray(getIntent().getByteArrayExtra("byteArray"), 0, getIntent().getByteArrayExtra("byteArray").length);

            int width= bitmap.getWidth();
            int height=bitmap.getHeight();

            int centerX=width/2;
            int centerY=height/2;
            srcMat = new Mat();
            Utils.bitmapToMat(bitmap, srcMat);
            //Imgproc.cvtColor(srcMat, matHSV, Imgproc.COLOR_BGR2HSV);
            srcMat.convertTo(srcMat, CvType.CV_64FC3); //http://answers.opencv.org/question/14961/using-get-and-put-to-access-pixel-values-in-java/
            int size = (int) (srcMat.total() * srcMat.channels());
            Mat matHSV = new Mat();
            Utils.bitmapToMat(bitmap, matHSV);
            double[] data = new double[size];

            srcMat.get(centerX, centerY, data);
            for (int i = 0; i < size; i++)
                data[i] = (data[i] / 2);  // no more casting required.
                Log.e("HSV Values:", String.valueOf(data[i]));
            



        

输出:

我得到了很多使用 Log.e 打印的值,尽管我在技术上假设只得到 3 个值,H、S 和 V。

【问题讨论】:

【参考方案1】:

您没有打印 HSV 值。

您的data 变量是一个双精度数组,其单元格数等于原始图像的像素数乘以通道数,因为您计算的size 变量的值不正确。您正在遍历该数组并在每次迭代中打印其每个元素,因此您正在打印 channels * width * height 值。

如果要获取中心单个像素的 HSV 值,只需这样做:

double[] data = srcMat.get(centerX, centerY);

现在数组包含了你想要的 3 个值。

或者,您可能想这样做:

 int size = (int) (srcMat.channels());

而不是这个:

int size = (int) (srcMat.total() * srcMat.channels());

【讨论】:

以上是关于OpenCV Java,读取中心像素的 HSV 值的主要内容,如果未能解决你的问题,请参考以下文章

python+opencv2怎么将图像像素值转换为float64用于后续计算

opencv如何读取多边形区域内的像素值?

OpenCV-像素值读写(java版)

Matlab 到 OpenCV:值在范围内的像素掩码

Opencv读写文件

为啥用Python的openCV读取图片与PIL读取的图片像素值会不一样?