如何按亮度过滤轮廓

时间:2016-03-08 12:23:00

标签: java opencv android-studio

几周前我开始使用opencv。我想知道是否有一个函数可以从轮廓列表中找出最亮的轮廓并绘制最亮的轮廓。到目前为止,我设法转换灰度,阈值图像和使用findContour函数来查找图像中的所有整个轮廓。

尝试使用minMax函数但无法找到它在java中的使用方式。

 public void process(Mat rgbaImage) {    
        Imgproc.threshold(rgbaImage,rgbaImage,230,255,Imgproc.THRESH_BINARY);    
        Imgproc.findContours(rgbaImage,contours,mHierarchy,Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);

       /* for(int id = 0; id < contours.size();id++) {

            double area = Imgproc.contourArea(contours.get(id));
            if (area > 8000){
                Log.i(TAG1, "contents founds at id" + id);
            }    

        } */   

    }`

1 个答案:

答案 0 :(得分:0)

如果你的“最亮”是指最亮的平均颜色,你可以使用cv :: mean(Mat src,Mat mask)。
遗憾的是我只知道C ++ OpenCV实现,但我认为Java版本几乎与C ++版本相同
C ++示例:

Mat src;  // This is your src image
vector<vector<Point>> contours;   // This is your array of contours

findContours(src.clone(), contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image

int brightestIdx = -1;
int brightestColor = -1;
for(int i=0; i<contours.size(); i++)
{
    // First, make a mask image of each contour
    Mat mask(src.cols, src.rows, CV_8U, Scalar(0));
    drawContours(mask, contours, i, Scalar(255), CV_FILLED);

    // Second, calculate average brightness with mask
    Scalar m = mean(src, mask);

    // Finally, compare current average with previous one
    if(m[0] > brightestColor)
    {
        brightestColor = m[0];
        brightestIdx = i;
    }
}

// Now you've found the brightest index.
// Do whatever you want.

Mat brightest_only(src.cols, src.rows, CV_8U, Scalar(0));
drawContours(brightest_only, contours, brightestIdx, Scalar(255), 1);