Created
October 19, 2013 03:21
-
-
Save apremalal/7051327 to your computer and use it in GitHub Desktop.
Microfilari detection based on Canny edge detection.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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("H:\\Academic\\ENTC\\FYP\\Suda\\AnuExp\\IMG_2945.jpg"); | |
/// 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( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback ); | |
thresh_callback( 0, 0 ); | |
waitKey(0); | |
return(0); | |
} | |
/** @function thresh_callback */ | |
void thresh_callback(int, void* ) | |
{ | |
Mat canny_output; | |
vector<vector<Point> > contours; | |
vector<Vec4i> hierarchy; | |
/// Detect edges using canny | |
Canny( src_gray, canny_output, thresh, thresh*2, 3 ); | |
/// Find contours | |
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); | |
vector<vector<Point> > contours_poly( contours.size() ); | |
vector<Rect> boundRect( contours.size() ); | |
vector<Point2f>center( contours.size() ); | |
vector<float>radius( contours.size() ); | |
/// Draw contours | |
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 ); | |
for( int i = 0; i < contours.size(); i++ ) | |
{ | |
approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true ); | |
boundRect[i] = boundingRect( Mat(contours_poly[i]) ); | |
minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] ); | |
} | |
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, 2, 8, hierarchy, 0, Point() ); | |
// rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 ); | |
if((int)radius[i]>50) | |
//cout << (int)radius[i] <<endl; | |
circle( drawing, center[i], (int)radius[i]+80, color, 2, 8, 0 ); | |
} | |
/// Show in a window | |
namedWindow( "Contours", CV_WINDOW_AUTOSIZE ); | |
imshow( "Contours", drawing ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment