opencv之7.6计算联通区域的形状描述


包围盒:水平放置的最小包围矩形。
Rect boundingRect( InputArray points )
最小包围圈:
void minEnclosingCircle( InputArray points,
CV_OUT Point2f& center, CV_OUT float& radius );
多边形近似:
void approxPolyDP( InputArray curve,
OutputArray approxCurve,
double epsilon, bool closed );
参数详解:
InputArray curve:一般是由图像的轮廓点组成的点集
OutputArray approxCurve:表示输出的多边形点集
double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数,5,6,7,8……
bool closed:表示输出的多边形是否封闭
凸包:将最外层的点连接起来构成的凸多边形
void convexHull( InputArray points, OutputArray hull,
bool clockwise = false, bool returnPoints = true );
convexHull第一个参数是要求凸包的点集,第二个参数是输出的凸包点,第三个参数是一个bool变量,表示求得的凸包是顺时针方向还是逆时针方向,true是顺时针方向。

代码:

#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main()
{
    cv::Mat image = cv::imread("D:/animal.jpg", 0);
    cv::Mat binary;
    cv::threshold(image, binary, 200, 255, cv::THRESH_BINARY_INV);
    cv::namedWindow("binary");
    cv::imshow("binary", binary);

<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;cv::Point&gt;</span>&gt;</span> contours;
cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
cv::Mat result(image.size(), CV_8U, cv::Scalar(<span class="hljs-number">255</span>));
cv::drawContours(result, contours, -<span class="hljs-number">1</span>, cv::Scalar(<span class="hljs-number">0</span>), <span class="hljs-number">2</span>);
cv::namedWindow(<span class="hljs-string">"contours"</span>);
cv::imshow(<span class="hljs-string">"contours"</span>, result);

<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;cv::Point&gt;</span>&gt;</span>::iterator it = contours.begin();
<span class="hljs-keyword">while</span> (it != contours.end())
{
    <span class="hljs-keyword">if</span> (it-&gt;size() &lt;<span class="hljs-number">250</span> || it-&gt;size()&gt;<span class="hljs-number">400</span>)
    {
        it = contours.erase(it);
    }
    <span class="hljs-keyword">else</span>
    {
        ++it;
    }
}
cv::Mat result1(image.size(), CV_8U, cv::Scalar(<span class="hljs-number">255</span>));
cv::drawContours(result1, contours, -<span class="hljs-number">1</span>, cv::Scalar(<span class="hljs-number">0</span>), <span class="hljs-number">2</span>);
cv::namedWindow(<span class="hljs-string">"contours1"</span>);
cv::imshow(<span class="hljs-string">"contours1"</span>, result1);
<span class="hljs-comment">//画方</span>
cv::Rect r0 = cv::boundingRect(cv::Mat(contours[<span class="hljs-number">0</span>]));
cv::rectangle(result1, r0, cv::Scalar(<span class="hljs-number">0</span>), <span class="hljs-number">2</span>);
<span class="hljs-comment">//画圆</span>
<span class="hljs-keyword">float</span> radius;
cv::Point2f center;
cv::minEnclosingCircle(cv::Mat(contours[<span class="hljs-number">1</span>]), center, radius);
cv::circle(result1, cv::Point(center), <span class="hljs-keyword">static_cast</span>&lt;<span class="hljs-keyword">int</span>&gt;(radius), cv::Scalar(<span class="hljs-number">0</span>), <span class="hljs-number">2</span>);

cv::Rect r1 = cv::boundingRect(cv::Mat(contours[<span class="hljs-number">4</span>]));
cv::rectangle(result1, r1, cv::Scalar(<span class="hljs-number">0</span>), <span class="hljs-number">2</span>);

<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;cv::Point&gt;</span> poly;
cv::approxPolyDP(cv::Mat(contours[<span class="hljs-number">2</span>]), poly, <span class="hljs-number">12</span>, <span class="hljs-keyword">true</span>);

<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Polygon size: "</span> &lt;&lt; poly.size() &lt;&lt; <span class="hljs-built_in">std</span>::endl;

<span class="hljs-comment">// Iterate over each segment and draw it</span>
<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;cv::Point&gt;</span>::const_iterator itp = poly.begin();
<span class="hljs-keyword">while</span> (itp != (poly.end() - <span class="hljs-number">1</span>)) {
    cv::line(result1, *itp, *(itp + <span class="hljs-number">1</span>), cv::Scalar(<span class="hljs-number">0</span>), <span class="hljs-number">2</span>);
    ++itp;
}
<span class="hljs-comment">// last point linked to first point</span>
cv::line(result1, *(poly.begin()), *(poly.end() - <span class="hljs-number">1</span>), cv::Scalar(<span class="hljs-number">20</span>), <span class="hljs-number">2</span>);

<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;cv::Point&gt;</span> hull;
cv::convexHull(cv::Mat(contours[<span class="hljs-number">3</span>]), hull);

<span class="hljs-comment">// Iterate over each segment and draw it</span>
<span class="hljs-built_in">std</span>::<span class="hljs-stl_container"><span class="hljs-built_in">vector</span>&lt;cv::Point&gt;</span>::const_iterator ith = hull.begin();
<span class="hljs-keyword">while</span> (ith != (hull.end() - <span class="hljs-number">1</span>)) {
    cv::line(result1, *ith, *(ith + <span class="hljs-number">1</span>), cv::Scalar(<span class="hljs-number">0</span>), <span class="hljs-number">2</span>);      <span class="hljs-comment">//指针别重名</span>
    ++ith;
}
<span class="hljs-comment">// last point linked to first point</span>
cv::line(result1, *(hull.begin()), *(hull.end() - <span class="hljs-number">1</span>), cv::Scalar(<span class="hljs-number">20</span>), <span class="hljs-number">2</span>);

cv::namedWindow(<span class="hljs-string">"contours2"</span>);
cv::imshow(<span class="hljs-string">"contours2"</span>, result1);

cv::waitKey(<span class="hljs-number">0</span>);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;

}


    包围盒:水平放置的最小包围矩形。
    Rect boundingRect( InputArray points )
    最小包围圈:
    void minEnclosingCircle( InputArray points,
    CV_OUT Point2f& center, CV_OUT float& radius );
    多边形近似:
    void approxPolyDP( InputArray curve,
    OutputArray approxCurve,
    double epsilon, bool closed );
    参数详解:
    InputArray curve:一般是由图像的轮廓点组成的点集
    OutputArray approxCurve:表示输出的多边形点集
    double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数,5,6,7,8……
    bool closed:表示输出的多边形是否封闭
    凸包:将最外层的点连接起来构成的凸多边形
    void convexHull( InputArray points, OutputArray hull,
    bool clockwise = false, bool returnPoints = true );
    convexHull第一个参数是要求凸包的点集,第二个参数是输出的凸包点,第三个参数是一个bool变量,表示求得的凸包是顺时针方向还是逆时针方向,true是顺时针方向。

    猜你喜欢

    转载自blog.csdn.net/a839766550/article/details/78324509
    今日推荐