include<opencv2\opencv.hpp>
include <iostream>
include<vector>
using namespace cv;
using namespace std;
/**
- @brief expandEdge 扩大边界函数
- @param img: 输出图像,单通道二值图,深度为 8
- @param edge 边界数组,寄存 4 条边界值
- @param edgeID 以后边界号
-
@return 布尔值 确定以后边界是否能够扩大
*/
bool expandEdge(const Mat & img, int edge[], const int edgeID)
{
//[1] – 初始化参数
int nc = img.cols;
int nr = img.rows;
switch (edgeID) {
case 0:if (edge[0]>nr) return false; for (int i = edge[3]; i <= edge[1]; ++i) {if (img.at<uchar>(edge[0], i) == 255)// 遇见 255 像素表明碰到边缘线 return false; } edge[0]++; return true; break;
case 1:
if (edge[1]>nc) return false; for (int i = edge[2]; i <= edge[0]; ++i) {if (img.at<uchar>(i, edge[1]) == 255)// 遇见 255 像素表明碰到边缘线 return false; } edge[1]++; return true; break;
case 2:
if (edge[2]<0) return false; for (int i = edge[3]; i <= edge[1]; ++i) {if (img.at<uchar>(edge[2], i) == 255)// 遇见 255 像素表明碰到边缘线 return false; } edge[2]--; return true; break;
case 3:
if (edge[3]<0) return false; for (int i = edge[2]; i <= edge[0]; ++i) {if (img.at<uchar>(i, edge[3]) == 255)// 遇见 255 像素表明碰到边缘线 return false; } edge[3]--; return true; break;
default:
return false; break;
}
}
/** - @brief 求取连通区域内接矩
- @param img: 输出图像,单通道二值图,深度为 8
- @param center: 最小外接矩的核心
- @return 最大内接矩形
-
基于核心扩大算法
*/
cv::Rect InSquare(Mat &img, const Point center)
{
// –[1] 参数检测
if (img.empty() ||img.channels()>1|| img.depth()>8)return Rect();
// –[2] 初始化变量
int edge[4];
edge[0] = center.y + 1;//top
edge[1] = center.x + 1;//right
edge[2] = center.y – 1;//bottom
edge[3] = center.x – 1;//left//[2] // --[3]边界扩大(核心扩散法)
bool EXPAND[4] = {1,1,1,1};// 扩大标记位
int n = 0;
while (EXPAND[0] || EXPAND[1] || EXPAND[2] || EXPAND[3])
{int edgeID = n % 4; EXPAND[edgeID] = expandEdge(img, edge, edgeID); n++;
}
//[3]
//qDebug() << edge[0] << edge[1] << edge[2] << edge[3];
Point tl = Point(edge[3], edge[0]);
Point br = Point(edge[1], edge[2]);
return Rect(tl, br);
}
int main()
{
bool isExistence = false;
float first_area = 0;
/// 加载源图像
Mat src;
src = imread(“cen.bmp”, 1);
//src = imread(“C:\Users\Administrator\Desktop\ 测试图片 \xxx\20190308152516.jpg”,1);
//src = PayPal 下载 imread(“C:\Users\Administrator\Desktop\ 测试图片 \xx\20190308151912.jpg”,1);
//src = imread(“C:\Users\Administrator\Desktop\ 测试图像 \2\BfImg17(x-247 y–91 z–666)-(492,280).jpg”,1);
cvtColor(src, src, CV_RGB2GRAY);
threshold(src, src, 100, 255, THRESH_BINARY);
Rect ccomp;
Point center(src.cols / 2, src.rows / 2);
//floodFill(src, center, Scalar(255, 255, 55), &ccomp, Scalar(20, 20, 20), Scalar(20, 20, 20));
if (src.empty())
{cout << "fali" << endl;
}
//resize(src, src, cv::Size(496, 460), cv::INTER_LINEAR);
imshow(“src”, src);
Rect rr = InSquare(src, center);
rectangle(src, rr, Scalar(255), 1, 8);
imshow(“src2”, src);
waitKey(0);
getchar();
return 0;
}