- Код: Выделить всё • Развернуть
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream.h>
void findCircles(IplImage* _image)
{
assert(_image!=0);
IplImage* bin = cvCreateImage( cvGetSize(_image), IPL_DEPTH_8U, 1);
cvConvertImage(_image, bin, CV_BGR2GRAY);
cvCanny(bin, bin, 50, 200);
/*IplImage* dts = 0;
dts = cvCloneImage(bin);
cvSmooth(dts,bin, CV_GAUSSIAN, 3, 3);*/
// cvNamedWindow( "bin", 1 );
//cvShowImage("bin", bin);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours=0;
int contoursCont = cvFindContours( bin, storage,&contours,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
contours = cvApproxPoly( contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 );
assert(contours!=0);
for( CvSeq* current = contours; current != NULL; current = current->h_next ){
double area = 0;
double perim = 0;
area = fabs(cvContourArea(current));
perim = cvContourPerimeter(current);
cout<<"fuk"<<area/perim<<" ";
cout<<"fup"<<perim/16<<" ";
// 1/4*CV_PI = 0,079577
if (((perim/4>=4*area/perim) && (perim/4<=(4*area/perim*0.05)+(4*area/perim)))
||((perim/16>=area/perim) && (perim/16<=(area/perim*0.05)+(area/perim)))
||((4*area/perim>=perim/4) && (4*area/perim<=(perim/4*0.05)+(perim/4)))
||((area/perim>=perim/16) && (area/perim<=(perim/16*0.05)+(perim/16)))){ // â 10% èíòåðâàëå
cvDrawContours(_image, current, cvScalar(255,0, 0), cvScalar(0,255, 0),0,4,8);
}
}
cvReleaseMemStorage(&storage);
cvReleaseImage(&bin);
}
int main(int argc, char* argv[])
{
cvNamedWindow("capture");
cvNamedWindow("image");
CvCapture *capture = cvCreateCameraCapture(CV_CAP_ANY);
assert(capture!=0);
IplImage* frame = 0;
//IplImage* dst = 0;
//CvSeq* contours = 0;
while(true){
frame = cvQueryFrame( capture );
cvShowImage("capture", frame);
// dst = cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 3 );
findCircles(frame);
cvShowImage("image", frame);
// cvShowImage("ima", dts);
char c = cvWaitKey(1);
if (c == 27) {
break;
}
}
cvReleaseCapture( &capture );
// cvReleaseImage(&dst);
cvDestroyAllWindows();
}
После первого запуска программа работала нормально но на следущий день когда сел дописывать программа начала выдавать ошибку не пойму где косячнул.И если не сложно помогите упростить алгоритм я понимаю что она написана криво но это всего лишь прототип заранее спасибо за помощь.