使用mat.get()获取OpenCV像素的颜色值有时会返回null。

9
我尝试在Android和OpenCV 2.4.4上使用mat.get(inx, int y)获取像素的RGB值。
Mat img = Utils.loadResource(getBaseContext(), R.drawable.ex3);
double[] tmp = img.get(100, 100);
if(printLog) Log.v(tag, "Color: "+ tmp[0] +","+ tmp[1] +","+ tmp[2] +"");

通常情况下,我会得到tmp-Array的返回值。但在某些像素上,我会得到“null”的返回值。(这些点在图片范围内!)

那么为什么在某些坐标上会得到数组,而在其他一些坐标上会得到“null”,如何解决这个问题?


cv::Mat 中没有 get 方法。img 的类型是什么? - Mikhail
img的类型是Mat。 - Paket2001
这是该get in mat的文档链接:http://docs.opencv.org/java/org/opencv/core/Mat.html#get%28int,%20int%29 - Paket2001
你的图像有3个通道吗?System.out.println(img.channels())的输出是什么? - andriy
看起来一切都正确。你尝试过将Mat写入图像文件并查看其表示是否正确吗?换句话说,如果像素没有失真...每次使用后也尝试img.release();。我之前因为内存问题遇到过类似的问题。 - andriy
你如何知道图像有多少个通道? - Jürgen K.
3个回答

13

在OpenCV中,通过使用Mat.get(row, col)获取像素信息时,X和Y的含义已经改变:使用Y表示行,使用X表示列。

Mat.get(Y, X);

在我的情况下,我超出了范围,但OpenCV没有返回异常。它返回了“null”。


它能抛出异常吗? - Arnaud Aliès

0
我会先检查你的Mat有多少个通道,可以使用Mat::channels()方法来实现,然后通过以下方式访问它们:

double[] tmp = img.at(100,100);


-1

如果您正在使用https://github.com/bytedeco/javacv,则可以通过以下方式单独访问每个像素

      IplImage image = cvLoadImage("path/to/image/get.jpg");

      public void colorProcess(IplImage image){
        CvMat result = CvMat.create(image.width(),image.height(), CV_32F);
        CvMat ff =image.asCvMat(); 

        for(int a=0;a<result.cols();a++){
             for(int b=0;b<result.rows();b++){

                CvScalar rgb = cvGet2D(ff, a, b);
                System.out.println("blue "+rgb.getVal(0)+"green "+rgb.getVal(1)+"red    "+rgb.getVal(2));

              }
        }

      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接