mirror of
https://github.com/opencv/opencv.git
synced 2024-12-23 07:58:00 +08:00
be63ce723f
updated links in cheatsheet renamed directory for Mat tutorial changed links from willow docs to opencv.itseez.com, from Trac to current Redmine
117 lines
2.9 KiB
ReStructuredText
117 lines
2.9 KiB
ReStructuredText
.. _hull:
|
|
|
|
Convex Hull
|
|
***********
|
|
|
|
Goal
|
|
=====
|
|
|
|
In this tutorial you will learn how to:
|
|
|
|
.. container:: enumeratevisibleitemswithsquare
|
|
|
|
* Use the OpenCV function :convex_hull:`convexHull <>`
|
|
|
|
|
|
Theory
|
|
======
|
|
|
|
Code
|
|
====
|
|
|
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/hull_demo.cpp>`_
|
|
|
|
.. code-block:: cpp
|
|
|
|
#include "opencv2/highgui/highgui.hpp"
|
|
#include "opencv2/imgproc/imgproc.hpp"
|
|
#include <iostream>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
using namespace cv;
|
|
using namespace std;
|
|
|
|
Mat src; Mat src_gray;
|
|
int thresh = 100;
|
|
int max_thresh = 255;
|
|
RNG rng(12345);
|
|
|
|
/// Function header
|
|
void thresh_callback(int, void* );
|
|
|
|
/** @function main */
|
|
int main( int argc, char** argv )
|
|
{
|
|
/// Load source image and convert it to gray
|
|
src = imread( argv[1], 1 );
|
|
|
|
/// Convert image to gray and blur it
|
|
cvtColor( src, src_gray, CV_BGR2GRAY );
|
|
blur( src_gray, src_gray, Size(3,3) );
|
|
|
|
/// Create Window
|
|
char* source_window = "Source";
|
|
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
|
|
imshow( source_window, src );
|
|
|
|
createTrackbar( " Threshold:", "Source", &thresh, max_thresh, thresh_callback );
|
|
thresh_callback( 0, 0 );
|
|
|
|
waitKey(0);
|
|
return(0);
|
|
}
|
|
|
|
/** @function thresh_callback */
|
|
void thresh_callback(int, void* )
|
|
{
|
|
Mat src_copy = src.clone();
|
|
Mat threshold_output;
|
|
vector<vector<Point> > contours;
|
|
vector<Vec4i> hierarchy;
|
|
|
|
/// Detect edges using Threshold
|
|
threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );
|
|
|
|
/// Find contours
|
|
findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
|
|
|
|
/// Find the convex hull object for each contour
|
|
vector<vector<Point> >hull( contours.size() );
|
|
for( int i = 0; i < contours.size(); i++ )
|
|
{ convexHull( Mat(contours[i]), hull[i], false ); }
|
|
|
|
/// Draw contours + hull results
|
|
Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
|
|
for( int i = 0; i< contours.size(); i++ )
|
|
{
|
|
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
|
|
drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
|
|
drawContours( drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
|
|
}
|
|
|
|
/// Show in a window
|
|
namedWindow( "Hull demo", CV_WINDOW_AUTOSIZE );
|
|
imshow( "Hull demo", drawing );
|
|
}
|
|
|
|
|
|
Explanation
|
|
============
|
|
|
|
Result
|
|
======
|
|
|
|
#. Here it is:
|
|
|
|
========== ==========
|
|
|Hull_0| |Hull_1|
|
|
========== ==========
|
|
|
|
.. |Hull_0| image:: images/Hull_Original_Image.jpg
|
|
:align: middle
|
|
|
|
.. |Hull_1| image:: images/Hull_Result.jpg
|
|
:align: middle
|
|
|