Android 使用OpenCV,如何找到;遮罩区域“;在一张蒙面的照片里?

Android 使用OpenCV,如何找到;遮罩区域“;在一张蒙面的照片里?,android,opencv,image-processing,opencv3.0,opencv4android,Android,Opencv,Image Processing,Opencv3.0,Opencv4android,使用OpenCV4Android,我如何获得遮罩图像中遮罩区域的第一个像素的HSV通道(ExplatedMat,在下面的片段中)我知道我们可以通过hsvMat.get(0,0)获得第一个像素的HSV通道值,但我不知道如何仅将其应用于遮罩区域,而不是整个Mat 例如,下面是一个函数,相机帧作为参数传递给它,我已经生成了一个掩码,但是我应该如何从那里开始呢 注意:请记住,遮罩区域不是矩形,而是不规则形状 例如,您可以计算ExplatedMat中每个blob的质心(x1,y1)(请参见FindTour

使用OpenCV4Android,我如何获得遮罩图像中遮罩区域的第一个像素的HSV通道(
ExplatedMat
,在下面的片段中)我知道我们可以通过
hsvMat.get(0,0)
获得第一个像素的HSV通道值,但我不知道如何仅将其应用于遮罩区域,而不是整个
Mat

例如,下面是一个函数,相机帧作为参数传递给它,我已经生成了一个掩码,但是我应该如何从那里开始呢

注意:请记住,遮罩区域不是矩形,而是不规则形状


例如,您可以计算ExplatedMat中每个blob的质心
(x1,y1)
(请参见
FindTours
connectedComponents[WithStats]
),然后访问
hsvImage
中的位置
x1,y1
。@Miki I确实尝试了通过列表轮廓=new ArrayList()查找Tours;Imgproc.findContours(扩展的网格、轮廓、新的网格()、Imgproc.RETR\u列表、Imgproc.CHAIN\u近似简单);。但再一次困惑。我不知道如何将get(0,0)函数(用于获取位于(0,0)位置的像素的HSV通道)应用于轮廓内的区域,而不是整个图像。@Miki我还应该提到,我的实际要求是获取找到的轮廓的平均HSV值(为了简单起见,假设只有一个轮廓,b/c我已经从找到的轮廓中找到了最大的轮廓)。因为我已经知道如何计算
垫的平均HSV(就像他们从第140行到第144行所做的那样),所以为了简单起见,我谈到了第一个(位于
(0,0)
)问题中的像素。大声想一想——你可以在HSV图像中的轮廓周围放置一个边界矩形,然后迭代该边界矩形中的每个像素。如果该像素位于轮廓内,则将其包括在平均值的计算中。也许有更有效的方法可以做到这一点?
private void detectColoredBlob (Mat rgbaFrame) { 
        Mat hsvImage = new Mat(); 
        Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_RGB2HSV_FULL);

        Mat maskedImage = new Mat(); 
        Scalar lowerThreshold = new Scalar(85, 50, 20); 
        Scalar upperThreshold = new Scalar(135, 255, 77); 
        Core.inRange(hsvImage, lowerThreshold, upperThreshold, maskedImage);

        Mat dilatedMat= new Mat(); 
        Imgproc.dilate(maskedImage, dilatedMat, new Mat() ); 

        //****************WHAT NOW???**************
     }