iOS openCV 获取掩码图中的最大矩形

2020-02-25  本文已影响0人  小点草

直接上代码

+(CGRect)maximumRectBy:(UIImage *)image{
    cv::Mat srcImgMat;
    UIImageToMat(image, srcImgMat);
    
//    cv::Mat resultMat;
//    cv::pyrDown(srcImgMat, resultMat);
    
    cv::Mat gray;
    cv::cvtColor(srcImgMat, gray, CV_BGR2GRAY);
    
    // 进行二值化处理
    cv::Mat binary;
        // 用cv::threshold函数创建一个二值图像。常规阈值化模型(CV_THRESH_BINARY)下,
        // 所有大于指定阈值的像素赋值为预定的最大值(参数4),将其他像素赋值为0
        cv::threshold(gray, binary, // 输入/输出图像
            80,                     // 阈值(必须<256)
            255,                    // 最大值
            CV_THRESH_BINARY);
    
    std::vector<cv::Mat> contours;
    
    cv::Mat hierarchy;
    
    cv::findContours(binary, contours,hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
    
    int minX = 0,maxX = 0,minY = 0,maxY = 0;
    
    for(int i=0;i<contours.size();i++){
        cv::Mat c = contours[i];
        cv::Rect rect = cv::boundingRect(c);
        
        int mx = rect.x,my = rect.y,mX = rect.x + rect.width,mY = rect.y + rect.height;
        if (i==0){
            minX = mx;
            maxX = mX;
            minY = my;
            maxY = mY;
        }else{
            minX = minX < mx ? minX : mx;
            maxX = maxX > mX ? maxX : mX;
            minY = minY < my ? minY : my;
            maxY = maxY > mY ? maxY : mY;
        }
        
    }
    CGRect cgRect = CGRectMake(minX, minY, maxX-minX, maxY-minY);
    
    if(CGRectIsEmpty(cgRect)){
        return CGRectMake(0, 0, image.size.width, image.size.height);
    }
    
    return cgRect;
    
}
上一篇下一篇

猜你喜欢

热点阅读