Skip to main content

OpenCV : Draw Contours

1. What is image contours?

It is a line connecting pixels with the same value. In other words, it can be called a line connecting pixels of the same color. So it is useful to tracking shape or recognizing objects.

contours example


2. How to draw image contours?

First, you need convert to gray image and make binary image by using Threshold, because it helps image recognition.

Mat img;
img = imread("./res/mh.jpg");
/* * convert to gray */
cvtColor(img, img, CV_RGB2GRAY); // convert image gray color 
imshow("gray", img);

/* * binary */
// if scalar value is bigger then 128, the value changed to 255. else 0 
threshold(img, img, 128, 255, CV_THRESH_BINARY);
imshow("binary", img);


Next, you can find contours by using findContours method. And you can put the outputArray into drawContours method to draw contours.

- void findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());  
- void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType = LINE_8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point()) 

Mat dst = Mat::zeros(img.rows, img.cols, CV_8UC3);
vector< vector<Point>> contours;
vector< Vec4i> hierarchy;

// RETR_CCOMP : This flag retrieves all the contours and arranges them to a 2-level hierarchy 
// CHAIN_APPROX_SIMPLE : Only points that can draw contours are saved. 
findContours(img.clone(), contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
drawContours(dst, contours, -1, CV_RGB(0, 255, 0), 1, 8, hierarchy);
imshow("contours", dst);
 
Bye.




Comments

Popular posts from this blog

OpenGL SL - Select compiler (Shader Toy)

GLSL (OpenGL Shading Language)   is a language that enables developers to directly control the graphics pipeline.  We will do GPU programming using GLSL.  And I recommend the Shadertoy to easily program it. By using Shadertoy, y ou can see the results of GLSL programming on the screen without OpenGL. It looks like below. I made simple mosaic effect. The great thing of this is you can program and take result on the screen in real time. We do not need to write GL code directly :) But this tool also has some rules. Because we don't program GL, there are some promised uniform variables. And I'll introduce some important input uniforms. uniform vec3 iResolution    (x,y,z of your screen resolution) uniform float iTime             (current time second info) uniform float iFrame              (current frame number info) uniform vec4 iMouse   ...

OpenGL SL - Mosaic effect

Mosaic effect is similar to lowering the resolution of an image. Let's see example image. And full source code likes below. void mainImage( out vec4 fragColor, in vec2 fragCoord ){     // Normalized pixel coordinates (from 0 to 1)     vec2 uv = fragCoord/iResolution.xy;     if (uv.x > 0.7 && uv.y < 0.4 ){          //left bottoom small image         uv.x -= 0.6 ;         uv *= 2.0 ;         fragColor = texture (iChannel0, uv);         fragColor += vec4 ( 0.2 );         return ;     }     //mosaic effect     uv = uv * 30.0 ;     vec2 uv = floor (uv);     uv = uv/ 30.0 ;     fragColor = texture (iChannel0, uv); } The key function of mosaic effect is "floor" If you want to make it sharper, multiply uv by ...

OpenGL SL - Translate, roate, and scale

Translate, rotate and scale are most basic element of image effect. If you didn't understand how make effect at each pixel, please read again before post "Show Video and Image" . 1. Translate Translation means each pixel move parallel on the x, y-axis. In other words, if you want to translate 0.25 on the x-axis, a pixel should point to a distance of -0.25 from the original. Translate ex) void mainImage( out vec4 fragColor, in vec2 fragCoord ){     vec2 uv = fragCoord/iResolution.xy;     if (uv.x < 0.5 ){         // translate to x ( -0.25 )         uv.x += 0.25 ;     } else {         // translate to x ( +0.25 )         uv.x -= 0.25 ;     }     fragColor = texture (iChannel0, uv); } result) 2. Scale Scale also has a  similar concept to parallel translation. If you want to zoom in twice, each pixel s...