ITPub博客

首页 > IT职业 > IT生活 > opencv 最大内接矩形笔记

opencv 最大内接矩形笔记

IT生活 作者:专注的阿熊 时间:2021-11-03 17:13:31 0 删除 编辑

#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 =外汇跟单gendan5.com imread("C:\\Users\\Administrator\\Desktop\\ 测试图片 \\xxx\\20190308152516.jpg",1);

//src = 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;

}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69946337/viewspace-2840460/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-23

  • 博文量
    248
  • 访问量
    137507