Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <cv.h>
- #include <highgui.h>
- int square(CvSeq *contour)
- {
- CvRect box;
- double R;
- box = cvBoundingRect(contour, 0);
- R = 1.0*box.width / box.height;
- if (R > 0.6 && R < 1.4) {
- return 1;
- }
- return 0;
- }
- CvSeq *extract_and_filter_CC(IplImage *img, CvMemStorage **m, int (*criteria) (CvSeq *))
- {
- CvSeq *contours, *ptr;
- CvMemStorage *mem = cvCreateMemStorage(0);
- cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP,
- CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
- ptr = contours;
- while (ptr != NULL){
- if (criteria(ptr) == 0) {
- if (ptr == contours) {
- contours = ptr->h_next;
- ptr = contours;
- ptr->h_prev = NULL;
- } else {
- ptr->h_prev->h_next = ptr->h_next;
- if (ptr->h_next != NULL)
- ptr->h_next->h_prev = ptr->h_prev;
- ptr = ptr->h_next;
- }
- } else {
- ptr = ptr->h_next;
- }
- }
- return contours;
- }
- int main(int argc, char *argv[])
- {
- IplImage *img, *cc_color; /*IplImage is an image in OpenCV*/
- CvMemStorage *mem;
- CvSeq *contours, *ptr;
- img = cvLoadImage(argv[1], 0); /* loads the image from the command line */
- cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
- cvThreshold(img, img, 150, 255, CV_THRESH_BINARY);
- cvNot(img, img);
- contours = extract_and_filter_CC(img, &mem, square);
- for (ptr = contours; ptr != NULL; ptr = ptr->h_next) {
- CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
- cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
- }
- cvSaveImage("result.png", cc_color);
- cvReleaseImage(&img);
- cvReleaseImage(&cc_color);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement