直接看代码,具体环境这里就不说了
// 检测边角点,然后画出最大矩形
+ (UIImage*)opneCvdot:(UIImage*)image {
cv::Mat src;
UIImageToMat(image, src);
cv::Mat grayMat;
cv::cvtColor(src, grayMat, CV_BGR2GRAY);
//根据参数找出角点
std::vector<cv::Point2f> corners;
int maxCorners = 8; // // 最多检测到的角点数, 12
double qualityLevel = 0.05; // 阈值系数 0.01
double minDistance = 10; // 角点间的最小距离 10
int blockSize = 10; // 计算协方差矩阵时的窗口大小 10
bool useHarrisDetector = false; // 是否使用Harris角点检测,如不指定,则计算shi-tomasi角点, false
double k = 0.04; // Harris角点检测需要的k值 0.04
cv::goodFeaturesToTrack(cv::InputArray(grayMat), cv::OutputArray(corners), maxCorners, qualityLevel, minDistance, cv::Mat(), blockSize, useHarrisDetector, k);
//建立包围所有角点的矩形
cv::Rect rect = cv::boundingRect(cv::InputArray(corners));
//把每个检测到的角点在图中用圆形标识出来(方便调试)
for( int i = 0; i < corners.size(); i++ )
{
cv::circle(cv::InputOutputArray(grayMat), corners[i], 10, cv::Scalar(0,255,0), 2, 8, 0);
}
//把包围所有角点的矩形也画出来(方便调试)
cv::rectangle(grayMat, rect, cv::Scalar(0,255,0), 5, 8, 0);
return MatToUIImage(grayMat);
}
下面是原图和效果图
原图:
效果图: