python代码:

from __future__ import print_function
from __future__ import division
import cv2 as cv
import numpy as np
# Create an image
r = 100
src = np.zeros((4*r, 4*r), dtype=np.uint8)
# Create a sequence of points to make a contour
vert = [None]*6
vert[0] = (3*r//2, int(1.34*r))
vert[1] = (1*r, 2*r)
vert[2] = (3*r//2, int(2.866*r))
vert[3] = (5*r//2, int(2.866*r))
vert[4] = (3*r, 2*r)
vert[5] = (5*r//2, int(1.34*r))
# Draw it in src
for i in range(6):cv.line(src, vert[i],  vert[(i+1)%6], ( 255 ), 3)
# Get the contours
_, contours, _ = cv.findContours(src, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)# Calculate the distances to the contour
raw_dist = np.empty(src.shape, dtype=np.float32)
for i in range(src.shape[0]):for j in range(src.shape[1]):raw_dist[i,j] = cv.pointPolygonTest(contours[0], (j,i), True)# 获取最大值即内接圆半径,中心点坐标
minVal, maxVal, _, maxDistPt = cv.minMaxLoc(raw_dist)
minVal = abs(minVal)
maxVal = abs(maxVal)# Depicting the  distances graphically
drawing = np.zeros((src.shape[0], src.shape[1], 3), dtype=np.uint8)
for i in range(src.shape[0]):for j in range(src.shape[1]):if raw_dist[i,j] < 0:drawing[i,j,0] = 255 - abs(raw_dist[i,j]) * 255 / minValelif raw_dist[i,j] > 0:drawing[i,j,2] = 255 - raw_dist[i,j] * 255 / maxValelse:drawing[i,j,0] = 255drawing[i,j,1] = 255drawing[i,j,2] = 255# max inner circle
cv.circle(drawing,maxDistPt, np.int(maxVal),(255,255,255), 1, cv.LINE_8, 0)
cv.imshow('Source', src)
cv.imshow('Distance and inscribed circle', drawing)cv.waitKey(0)
cv.destroyAllWindows()

C++代码:

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(void)
{const int r = 100;Mat src = Mat::zeros(Size(4 * r, 4 * r), CV_8U);vector<Point2f> vert(6);vert[0] = Point(3 * r / 2, static_cast<int>(1.34*r));vert[1] = Point(1 * r, 2 * r);vert[2] = Point(3 * r / 2, static_cast<int>(2.866*r));vert[3] = Point(5 * r / 2, static_cast<int>(2.866*r));vert[4] = Point(3 * r, 2 * r);vert[5] = Point(5 * r / 2, static_cast<int>(1.34*r));for (int i = 0; i < 6; i++){line(src, vert[i], vert[(i + 1) % 6], Scalar(255), 3);}// �����β���vector<vector<Point> > contours;findContours(src, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);Mat raw_dist(src.size(), CV_32F);for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){raw_dist.at<float>(i, j) = (float)pointPolygonTest(contours[0], Point2f((float)j, (float)i), true);}}// ��ȡ���� �Բ�뾶double minVal, maxVal;Point maxDistPt; // inscribed circle centerminMaxLoc(raw_dist, &minVal, &maxVal, NULL, &maxDistPt);minVal = abs(minVal);maxVal = abs(maxVal);Mat drawing = Mat::zeros(src.size(), CV_8UC3);for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){if (raw_dist.at<float>(i, j) < 0){drawing.at<Vec3b>(i, j)[0] = (uchar)(255 - abs(raw_dist.at<float>(i, j)) * 255 / minVal);}else if (raw_dist.at<float>(i, j) > 0){drawing.at<Vec3b>(i, j)[2] = (uchar)(255 - raw_dist.at<float>(i, j) * 255 / maxVal);}else{drawing.at<Vec3b>(i, j)[0] = 255;drawing.at<Vec3b>(i, j)[1] = 255;drawing.at<Vec3b>(i, j)[2] = 255;}}}// draw max inner circlecircle(drawing, maxDistPt, (int)maxVal, Scalar(255, 255, 255));imshow("Source", src);imshow("Distance and inscribed circle", drawing);waitKey();return 0;
}

对于轮廓来说,有时候我们会需要选择最大内接圆,OpenCV中没有现成的API可以使用,但是我们可以通过点多边形测试巧妙的获取轮廓最大内接圆的半径,从点多边形测试的返回结果我们知道,它返回的是像素距离,而且是当前点距离轮廓最近的距离,当这个点在轮廓内部,其返回的距离是最大值的时候,其实这个距离就是轮廓的最大内接圆的半径,这样我们就巧妙的获得了圆心的位置与半径,剩下的工作就很容易了完成,绘制一个圆而已,一行代码就可以搞定,而且前面我们的知识点分享已经交代了如何在OpenCV中去绘制常见几何形状啦。

OpenCV学习笔记代码,欢迎follow:

MachineLP/OpenCV-​github.com

opencv 最大内接矩形_OpenCV之二值图像分析 – 寻找最大内接圆相关推荐

  1. python莫比乌斯内接矩形_用莫比乌斯带巧解内接矩形问题:拓扑学的用处

    问题 对于任意的闭合环路,是否总能在其上找到四个点形成一个矩形? 该问题也被称为内接矩形问题,而内接正方形问题至今没有解答方案. 首先我们不再关注单个而是成对的点,并利用矩形的性质:对于平面上任意两对 ...

  2. python opencv最小外接矩形_Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

  3. 用莫比乌斯带巧解内接矩形问题:拓扑学的用处

    问题 对于任意的闭合环路,是否总能在其上找到四个点形成一个矩形? 该问题也被称为内接矩形问题,而内接正方形问题至今没有解答方案. 首先我们不再关注单个而是成对的点,并利用矩形的性质:对于平面上任意两对 ...

  4. OpenCV | 二值图像分析的技巧都在这里

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 轮廓模型 二值图像分析最常见的一个主要 ...

  5. OpenCV二值图像分析之形态学应用技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 二值图像分析一块核心技能就是图像形态 ...

  6. opencv 最大内接矩形笔记

    python 最小外接矩形, 最小外接矩形的顶点坐标:cv2.boxPoints cnt = np.array([[data_0_x, data_0_y], [data_1_x, data_1_y], ...

  7. 二值图像分析:OpenCV中的二值化阈值操作

    二值图像分析:OpenCV中的二值化阈值操作 1.二值图像的定义 2.OpenCV中的基本阈值操作 3.OTSU二值寻找算法 3.1 OTSU二值寻找算法介绍 3.2 OTSU二值寻找算法分析 3.2 ...

  8. OPENCV 寻找图形最大内接矩形

      轮廓的最大外接矩形,Opencv有提供的现成的算法,最大内接圆也有提供的算法.但是没有现成的内接矩形的算法.本文使用C++实现了取轮廓最大内接矩形的方式,供大家参考. 实现的基本思路是: 处理图片 ...

  9. OpenCV轮廓最大内接矩形(带角度)-计算与绘制(Python / C++源码)

    实现效果 OpenCV获取轮廓/Blob最大内接矩形(带角度) 实现源码 一.C++ OpenCV实现: #include "pch.h" #include <iostrea ...

最新文章

  1. 爆改古董卡西欧计算器!能联网、能聊天,「作弊神器」只要150块
  2. 人类基因测序被重新定义,时间减半创世界纪录
  3. 前端工程化系列[06]-Yeoman脚手架核心机制
  4. 商城模板网站html5手机端_网站建设中,pc端与手机移动端设计一样吗
  5. 正则提取编码解码问题
  6. 不一致的国际数据隐私法
  7. 怎样快速识别 英文地址中包含非英文字符_[论文笔记]端到端的场景文本识别算法--CRNN 论文笔记...
  8. 消防信号二总线有没电压_杭后旗医院消防消防设备电源原理
  9. 基于TCP/IP的IEC60870-5-104远动通信协议
  10. win7纯净版系统哪里下载好
  11. PDF怎么快速统计文档字数?这两种方法很简单
  12. html页面设置document类型,解析网页头部代码:Html Document
  13. Android GMS认证总结01
  14. 手机三十分钟熄屏如何一直亮_oppo如何把自动熄屏永远不熄屏 建议检查手机背光时长设置--...
  15. 解决:未定义标识符 “sleep“ 或 “sleep“:找不到标识符
  16. mongoDB 高级查询(一)
  17. easyexcel一个很棒的Excel解析工具
  18. VS无法下载,提示无法连接到网络
  19. 第二章 第二十节 最值求解——刁老师
  20. ES6面试、复习干货知识点汇总

热门文章

  1. 使用CSS实现网格+渐变背景色的Web页面背景
  2. 计算机系统中字word的描述性定义是,计算机基础练习题1
  3. android的底部弹出框炫酷的样式,Android自定义底部弹出框ButtomDialog
  4. Caffe︱构建lmdb数据集、binaryproto均值文件及各类难辨的文件路径名设置细解
  5. CentOS 7.5 编译安装 Nginx 1.15.3
  6. 在C#中判断某个类是否实现了某个接口
  7. MicroPython-GPRS教程之TPYBoardv702GPRS功能测试
  8. MyEclipse使用经验归纳
  9. spring +mybatis 事务不会滚
  10. C# 执行文件的根目录 (转)