• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:opencv-最大内接矩形笔记

python 搞代码 3年前 (2022-02-20) 61次浏览 已收录 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 = 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;
    }


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:opencv-最大内接矩形笔记

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址