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

标签 java c++ opencv

我似乎从下面的代码中得到了 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。

enter image description here

最佳答案

您没有打印 HSV 值。

您的 data 变量是一个 double 组,其单元格数等于原始图像的像素数乘以 channel 数,因为您已经计算了 size 变量不正确。您正在迭代该数组并在每次迭代中打印它的每个元素,因此您正在打印 channels * width * height 值。

如果你想得到中心单个像素的HSV值,只需这样做:

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

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

或者,您可能想这样做:

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

取而代之的是:

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

关于java - OpenCV Java,读取中心像素的HSV值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45538754/

相关文章:

java - Struts 2 - 填充 s :select from server based on first s:select

c++ - 派生类的成员函数是否继承了基类的虚拟性?

c++ - 在 C++ 中分配回调函数

c++ - opencv和tesseract有冲突吗?

c++ - 如何在 OpenCV 函数中访问多维矩阵的子矩阵?

c++ - OpenCV2 设置 VideoBackend

java - JmenuItem 鼠标按下有效,但鼠标单击事件不起作用?为什么?

java - Java 中传递 ActionListener,pack()

java - Rest Api异常处理

c++ - 交叉编译 VisualGDB/C++ Cubietruck => Linkererror