Android 使用OpenCV,如何找到;遮罩区域“;在一张蒙面的照片里?
使用OpenCV4Android,我如何获得遮罩图像中遮罩区域的第一个像素的HSV通道(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
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???**************
}