简 介: 本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。

关键词OpenCVcontours中心点

#mermaid-svg-s8wS2WuzmWvkG3Nl .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .label text{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .node rect,#mermaid-svg-s8wS2WuzmWvkG3Nl .node circle,#mermaid-svg-s8wS2WuzmWvkG3Nl .node ellipse,#mermaid-svg-s8wS2WuzmWvkG3Nl .node polygon,#mermaid-svg-s8wS2WuzmWvkG3Nl .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-s8wS2WuzmWvkG3Nl .node .label{text-align:center;fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .node.clickable{cursor:pointer}#mermaid-svg-s8wS2WuzmWvkG3Nl .arrowheadPath{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-s8wS2WuzmWvkG3Nl .flowchart-link{stroke:#333;fill:none}#mermaid-svg-s8wS2WuzmWvkG3Nl .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-s8wS2WuzmWvkG3Nl .edgeLabel rect{opacity:0.9}#mermaid-svg-s8wS2WuzmWvkG3Nl .edgeLabel span{color:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-s8wS2WuzmWvkG3Nl .cluster text{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-s8wS2WuzmWvkG3Nl .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-s8wS2WuzmWvkG3Nl text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-s8wS2WuzmWvkG3Nl .actor-line{stroke:grey}#mermaid-svg-s8wS2WuzmWvkG3Nl .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .sequenceNumber{fill:#fff}#mermaid-svg-s8wS2WuzmWvkG3Nl #sequencenumber{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl #crosshead path{fill:#333;stroke:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .messageText{fill:#333;stroke:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-s8wS2WuzmWvkG3Nl .labelText,#mermaid-svg-s8wS2WuzmWvkG3Nl .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-s8wS2WuzmWvkG3Nl .loopText,#mermaid-svg-s8wS2WuzmWvkG3Nl .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-s8wS2WuzmWvkG3Nl .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-s8wS2WuzmWvkG3Nl .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-s8wS2WuzmWvkG3Nl .noteText,#mermaid-svg-s8wS2WuzmWvkG3Nl .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-s8wS2WuzmWvkG3Nl .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-s8wS2WuzmWvkG3Nl .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-s8wS2WuzmWvkG3Nl .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-s8wS2WuzmWvkG3Nl .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .section{stroke:none;opacity:0.2}#mermaid-svg-s8wS2WuzmWvkG3Nl .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-s8wS2WuzmWvkG3Nl .section2{fill:#fff400}#mermaid-svg-s8wS2WuzmWvkG3Nl .section1,#mermaid-svg-s8wS2WuzmWvkG3Nl .section3{fill:#fff;opacity:0.2}#mermaid-svg-s8wS2WuzmWvkG3Nl .sectionTitle0{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .sectionTitle1{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .sectionTitle2{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .sectionTitle3{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-s8wS2WuzmWvkG3Nl .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .grid path{stroke-width:0}#mermaid-svg-s8wS2WuzmWvkG3Nl .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-s8wS2WuzmWvkG3Nl .task{stroke-width:2}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskText:not([font-size]){font-size:11px}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-s8wS2WuzmWvkG3Nl .task.clickable{cursor:pointer}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskText0,#mermaid-svg-s8wS2WuzmWvkG3Nl .taskText1,#mermaid-svg-s8wS2WuzmWvkG3Nl .taskText2,#mermaid-svg-s8wS2WuzmWvkG3Nl .taskText3{fill:#fff}#mermaid-svg-s8wS2WuzmWvkG3Nl .task0,#mermaid-svg-s8wS2WuzmWvkG3Nl .task1,#mermaid-svg-s8wS2WuzmWvkG3Nl .task2,#mermaid-svg-s8wS2WuzmWvkG3Nl .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutside0,#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutside2{fill:#000}#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutside1,#mermaid-svg-s8wS2WuzmWvkG3Nl .taskTextOutside3{fill:#000}#mermaid-svg-s8wS2WuzmWvkG3Nl .active0,#mermaid-svg-s8wS2WuzmWvkG3Nl .active1,#mermaid-svg-s8wS2WuzmWvkG3Nl .active2,#mermaid-svg-s8wS2WuzmWvkG3Nl .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-s8wS2WuzmWvkG3Nl .activeText0,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeText1,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeText2,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeText3{fill:#000 !important}#mermaid-svg-s8wS2WuzmWvkG3Nl .done0,#mermaid-svg-s8wS2WuzmWvkG3Nl .done1,#mermaid-svg-s8wS2WuzmWvkG3Nl .done2,#mermaid-svg-s8wS2WuzmWvkG3Nl .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-s8wS2WuzmWvkG3Nl .doneText0,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneText1,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneText2,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneText3{fill:#000 !important}#mermaid-svg-s8wS2WuzmWvkG3Nl .crit0,#mermaid-svg-s8wS2WuzmWvkG3Nl .crit1,#mermaid-svg-s8wS2WuzmWvkG3Nl .crit2,#mermaid-svg-s8wS2WuzmWvkG3Nl .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCrit0,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCrit1,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCrit2,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCrit0,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCrit1,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCrit2,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-s8wS2WuzmWvkG3Nl .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-s8wS2WuzmWvkG3Nl .milestoneText{font-style:italic}#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCritText0,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCritText1,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCritText2,#mermaid-svg-s8wS2WuzmWvkG3Nl .doneCritText3{fill:#000 !important}#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCritText0,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCritText1,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCritText2,#mermaid-svg-s8wS2WuzmWvkG3Nl .activeCritText3{fill:#000 !important}#mermaid-svg-s8wS2WuzmWvkG3Nl .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-s8wS2WuzmWvkG3Nl g.classGroup text .title{font-weight:bolder}#mermaid-svg-s8wS2WuzmWvkG3Nl g.clickable{cursor:pointer}#mermaid-svg-s8wS2WuzmWvkG3Nl g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-s8wS2WuzmWvkG3Nl g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-s8wS2WuzmWvkG3Nl .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-s8wS2WuzmWvkG3Nl .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-s8wS2WuzmWvkG3Nl .dashed-line{stroke-dasharray:3}#mermaid-svg-s8wS2WuzmWvkG3Nl #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl .commit-id,#mermaid-svg-s8wS2WuzmWvkG3Nl .commit-msg,#mermaid-svg-s8wS2WuzmWvkG3Nl .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-s8wS2WuzmWvkG3Nl g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-s8wS2WuzmWvkG3Nl g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-s8wS2WuzmWvkG3Nl g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-s8wS2WuzmWvkG3Nl .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-s8wS2WuzmWvkG3Nl .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-s8wS2WuzmWvkG3Nl .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-s8wS2WuzmWvkG3Nl .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-s8wS2WuzmWvkG3Nl .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-s8wS2WuzmWvkG3Nl .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-s8wS2WuzmWvkG3Nl .edgeLabel text{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-s8wS2WuzmWvkG3Nl .node circle.state-start{fill:black;stroke:black}#mermaid-svg-s8wS2WuzmWvkG3Nl .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-s8wS2WuzmWvkG3Nl #statediagram-barbEnd{fill:#9370db}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-state .divider{stroke:#9370db}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-s8wS2WuzmWvkG3Nl .note-edge{stroke-dasharray:5}#mermaid-svg-s8wS2WuzmWvkG3Nl .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-s8wS2WuzmWvkG3Nl .error-icon{fill:#522}#mermaid-svg-s8wS2WuzmWvkG3Nl .error-text{fill:#522;stroke:#522}#mermaid-svg-s8wS2WuzmWvkG3Nl .edge-thickness-normal{stroke-width:2px}#mermaid-svg-s8wS2WuzmWvkG3Nl .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-s8wS2WuzmWvkG3Nl .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-s8wS2WuzmWvkG3Nl .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-s8wS2WuzmWvkG3Nl .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-s8wS2WuzmWvkG3Nl .marker{fill:#333}#mermaid-svg-s8wS2WuzmWvkG3Nl .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-s8wS2WuzmWvkG3Nl {color: rgba(0, 0, 0, 0.75);font: ;}

寻找轮廓的中心
目 录
Contents
形状检测和分析
利用OpenCV寻
找边界中心点
总 结

§01 寻找轮廓的中心


  今天在图像处理中需要用到OpenCV的轮廓中心,在 OpenCV center of contour 中看到了给定的方法。将其总结如下,便于以后的应用。

1.1 形状检测和分析

  今天我们开启一个新的三联示例程序,用于形状检测和分析。通过这个系列,我们可以:
  1. 计算边界、形状的中心点;
  2. 识别不同的形状,比如圆形、方形,举行,三角形,五边形。这些仅仅根据边界的性质就可以进行识别;
  3. 标示形状的颜色。

  相比于PyImageSearch网文来说,这个话题比较基础,但是为了回应下面我所遇到的提问:

我如何能够使用Python和OpenCV计算边界的中心点?

  今天的博文中,我将回答上面的问题。

  在这个系列的上一篇博文中,我们基于已经知晓了物体的边界然后来识别图像中的形状。

1.2 利用OpenCV寻找边界中心点

▲ 图1.1.1 下面将要使用到的具有很多不同颜色形状的图片

  在上面的图像中,你可以看到一系列从建筑纸张材料切割下来的不同形状,也注意到他们并不是完美的多边形,也就是长方形并不是严格的长方形,圆形也不是那么的圆。毕竟它们是人徒手绘制出并切割下来的形状,所以包含了不同的变形。

  记住这一点,今天的教程的目的是:

  • 检测图片中各种形状的外轮廓;
  • 接着计算所有形状的中心点,也称为区域的中心;

  为了实现这个目标,我们需要进行一些图像处理,包括:

  • 将图片转换成灰度图;
  • 进行模糊化来提高轮廓检测精度;
  • 将图像进行二值化;采用经典的边缘检测和阈值处理完成二值化。这里采用阈值处理的方式。
      在开始正式编程之前,你需要先保证在你的系统中已经安装了 imutils Python Packages
pip install --upgrade imutils

  现在我们可以开始编程了。

  建立一个新的文件,命名为: center_of_shape.py,下面是相应的代码:

# import the necessary packages
import argparse
import imutils
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to the input image")
args = vars(ap.parse_args())
# load the image, convert it to grayscale, blur it slightly,
# and threshold it
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]

  2 - 4 行为输入相应的软件包,接着对于命令行参数进行分析。 我们只需要单开关量 ---image ,这是给出我们需要处理的图片在磁盘上的路径。

  我们将该图像从磁盘上载入到及其内存,使用灰度转换进行预处理。采用5×5尺寸的高斯核完成图像平滑,最后进行阈值处理。

  输出的图像如下图所示:

▲ 图1.2.2 将图片进行阈值处理输出二值化的图片,这类形状为白色,背景为黑色

  可以注意到,经过阈值处理,各类形状为白色,背景为黑色。

  下一步就是找到这些区域的边缘:

# find contours in the thresholded image
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

  在程序中的20 - 21 行,调用 cv2.findContours 返回形状的轮廓,对应的图片中白色大块区域的边缘。 根据所使用的OpenCV的版本不同, 2.4.3,2.3.4 行22 使用恰当的元组参数。你可以在 这个链接 看到关于不同OpenCV版本在 cv2.findContours 函数返回的不同参数。

  下面我们开始处理每一个轮廓:

# loop over the contours
for c in cnts:# compute the center of the contourM = cv2.moments(c)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])# draw the contour and center of the shape on the imagecv2.drawContours(image, [c], -1, (0, 255, 0), 2)cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1)cv2.putText(image, "center", (cX - 20, cY - 20),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)# show the imagecv2.imshow("Image", image)cv2.waitKey(0)

  程序行 25 是开始一个循环来处理每一个单个轮廓,紧接着 程序行27 计算他们的图像矩( image moments )。

  在计算机视觉和图像处理中,图像矩表征了图像中物体的形状。这些矩给出了 形状的基本统计特征,包括物体的面积,中心(也就是物体中心 (x,y)\left( {x,y} \right)(x,y) 的坐标位置),方向以及其他的一些可能用到的特性。

  这里我们只对轮廓的中心感兴趣,通过程序行 28 - 29 我们计算获得轮廓的中心点。

  从程序行 32-34 进行如下的处理:

  • 通过使用 cv2.drawContours 在当前形状周围绘制轮廓;
  • 在形状中心 (cX, cY) 绘制白色圆圈;
  • 在白色圆圈附近输出字符text

  在计算机命令窗口使用下面的命令运行上述Python程序:

$ python center_of_shape.py --image shapes_and_colors.png

  下面是显示的运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBoGbgBA-1643421016158)(https://pyimagesearch.com/wp-content/uploads/2016/01/center_of_contour_results.gif#pic_center =560x )]

▲ 图1.2.3 处理结果

  你可以看到每一个形状都被正确的检测到。

※ 总  结 ※


  本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点。当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准。


■ 相关文献链接:

  • OpenCV center of contour
  • imutils Python Packages
  • 这个链接
  • image moments

● 相关图表链接:

  • 图1.1.1 下面将要使用到的具有很多不同颜色形状的图片
  • 图1.2.2 将图片进行阈值处理输出二值化的图片,这类形状为白色,背景为黑色

如何利用OpenCV寻找轮廓的中心?相关推荐

  1. 使用Python、OpenCV计算轮廓的中心

    1. 使用Python.OpenCV计算轮廓的中心并标记 2. 使用Python.OpenCV检测轮廓的形状并标记 3. 使用颜色通道统计信息来标记形状的实际颜色并标记 本博客的目标:(1)检测图像中 ...

  2. Python,OpenCV应用轮廓逼近算法,检测对象的形状

    上一篇博客,我们学习了如何利用Python.OpenCV计算轮廓的中心,这一节学习仅运用轮廓的基本属性来检测其形状,三角形,正方形,矩形,五边形,圆. (1)利用轮廓逼近,将曲线上的点数减少为更简单的 ...

  3. python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)

    python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码 一.前言 今天的低价单孔摄像机(照相机)会给图像带来很多畸变.畸变主要有两 种:径向畸变和切想畸变.如下图所示,用 ...

  4. 利用OpenCV进行图像的轮廓检测

    简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用.接着对四种不同的提取方式的结果进行了讨论.你还了解了如何将轮廓进行绘制的方法. 关键词: 轮廓检测,二值化 § ...

  5. 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配

    本文承接博主的上一篇博文: 什么叫图像或轮廓的空间矩.中心矩.归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置 继续介绍Hu矩的相关知识. Hu矩是由二阶和三阶中心距计算 ...

  6. 使用Python,OpenCV寻找图像中的轮廓

    使用Python和OpenCV查找图像中的形状 1. 效果图 2. 步骤 3. 源码 参考 这篇博客将讨论使用Python和OpenCV查找图像中的形状,具体是 cv2.inRange在图像中查找形状 ...

  7. OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试

    在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...

  8. OpenCV 在图像中寻找轮廓

    使用OpenCV函数 findContours 使用OpenCV函数 drawContours 滤波--消除噪声 增强--使边界轮廓更加明显 检测--选出边缘点 例程 #include "o ...

  9. OpenCV在图像中寻找轮廓的实例(附完整代码)

    OpenCV在图像中寻找轮廓的实例 OpenCV在图像中寻找轮廓的实例 OpenCV在图像中寻找轮廓的实例 #include "opencv2/imgcodecs.hpp" #in ...

最新文章

  1. Oracle配置方面问题收集
  2. 文件传输_python socket实现文件传输(防粘包)
  3. 韵镖侠登录不上 显示无法连接到服务器,什么是韵镖侠?韵镖侠是做什么的?...
  4. Push rejected: Push to origin/master was rejected
  5. 墨迹天气android,墨迹天气Android产品分析
  6. telnet服务下载 Linux,linux telnet服务安装包
  7. 012 注解式异常处理器
  8. 天正电气lisp是什么文件_模仿天正电气低压系统图 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  9. 软件因丢失.dll文件(未找到)而无法启动?
  10. 让你提前认识软件开发(15):程序调试的利器—日志
  11. 2012网页设计趋势(上)
  12. java response 输出word_java导出数据到word(一)
  13. HTML5 data-* 自定义属性 ---转载 原文地址:https://www.cnblogs.com/dolphinX/p/3348458.html...
  14. 如何强制App横屏或者竖屏显示应用
  15. Docker数据卷映射
  16. 2020-04-08
  17. NPDP产品经理小知识-质量功能展开和质量屋
  18. iOS开发之Crash分析,以及收集
  19. Vue + 高德地图 + 三维模型
  20. 你的声音价值百万,教你六个利用声音赚钱的方法

热门文章

  1. Python包管理工具pip安装
  2. bash: /usr/lib/jvm/jdk1.7.0_80/bin/java: No such file or directory 问题
  3. Socket阻塞,非阻塞,同步,异步
  4. Poj 1151-Atlantis 矩形切割
  5. 输入http://localhost/,apache出现You don't have permission to access/on this server.的提示,如何解决?...
  6. 【ArchSummit北京2015】公有云平台发展与建设实战解析
  7. 2015年11月 广州深圳 MVP 线下活动
  8. nginx location 配置详细解释
  9. 〖Android〗Android App项目资源字符串检查(检查是否缺少对应的翻译,导致系统切换语言后崩溃)...
  10. JQuery学习笔记02-选择器把需要的东西揪出来(基础)