Goal
In this tutorial you will learn how to:
- Use the OpenCV function cv::moments
- Use the OpenCV function cv::contourArea
- Use the OpenCV function cv::arcLength
Theory
Code
This tutorial code's is shown lines below. You can also download it from here
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
void thresh_callback(int, void* );
int main( int, char** argv )
{
src = imread( argv[1], IMREAD_COLOR );
cvtColor( src, src_gray, COLOR_BGR2GRAY );
const char* source_window = "Source";
namedWindow( source_window, WINDOW_AUTOSIZE );
imshow( source_window, src );
thresh_callback( 0, 0 );
waitKey(0);
return(0);
}
void thresh_callback(int, void* )
{
Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Canny( src_gray, canny_output, thresh, thresh*2, 3 );
vector<Moments> mu(contours.size() );
for( size_t i = 0; i < contours.size(); i++ )
vector<Point2f> mc( contours.size() );
for( size_t i = 0; i < contours.size(); i++ )
{ mc[i] = Point2f( static_cast<float>(mu[i].m10/mu[i].m00) , static_cast<float>(mu[i].m01/mu[i].m00) ); }
for( size_t i = 0; i< contours.size(); i++ )
{
circle( drawing, mc[i], 4, color, -1, 8, 0 );
}
imshow( "Contours", drawing );
printf("\t Info: Area and Contour Length \n");
for( size_t i = 0; i< contours.size(); i++ )
{
printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", (int)i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) );
circle( drawing, mc[i], 4, color, -1, 8, 0 );
}
}
Explanation
Canny() [1/2]
void cv::Canny | ( | InputArray | image, |
OutputArray | edges, | ||
double | threshold1, | ||
double | threshold2, | ||
int | apertureSize = 3 , | ||
bool | L2gradient = false | ||
) |
Finds edges in an image using the Canny algorithm [26] .
The function finds edges in the input image image and marks them in the output map edges using the Canny algorithm. The smallest value between threshold1 and threshold2 is used for edge linking. The largest value is used to find initial segments of strong edges. See http://en.wikipedia.org/wiki/Canny_edge_detector
- Parameters
image 8-bit input image. edges output edge map; single channels 8-bit image, which has the same size as image . threshold1 first threshold for the hysteresis procedure. threshold2 second threshold for the hysteresis procedure. apertureSize aperture size for the Sobel operator. L2gradient a flag, indicating whether a more accurate L2 norm=(dI/dx)2+(dI/dy)2−−−−−−−−−−−−−−−−√ should be used to calculate the image gradient magnitude ( L2gradient=true ), or whether the defaultL1 norm=|dI/dx|+|dI/dy| is enough ( L2gradient=false ).
Result
Here it is:
No comments:
Post a Comment