直接上代码
+(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;
}