// Look for the centroid of each point with the intensity of the pixel as weight vector<CvPoint> centroiding(vector<vector<CvPoint3D32f> > points){ vector<CvPoint> res; long x; long y; long intensity; for (int i = 0; i < points.size(); i++){ x = 0; y = 0; intensity = 0; for (int j = 0; j < points[i].size(); j++){ intensity += points[i][j].z; x += points[i][j].x * points[i][j].z; y += points[i][j].y * points[i][j].z; } if (intensity != 0){ x = (int) (x/intensity); y = (int) (y/intensity); } res.push_back(cvPoint((int) x, (int) y)); // display it cvLine(imageObjectHSV, cvPoint((int)x-2,(int)y), cvPoint((int)x+2,(int)y), CvScalar(255,255,255,0)); cvLine(imageObjectHSV, cvPoint((int)x,(int)y-2), cvPoint((int)x,(int)y+2), CvScalar(255,255,255,0)); cvLine(imageObjectRGB, cvPoint((int)x-2,(int)y), cvPoint((int)x+2,(int)y), CvScalar(255,255,255,0)); cvLine(imageObjectRGB, cvPoint((int)x,(int)y-2), cvPoint((int)x,(int)y+2), CvScalar(255,255,255,0)); cvLine(frameToSave, cvPoint((int)x-2,(int)y), cvPoint((int)x+2,(int)y), CvScalar(255,0,0,0)); cvLine(frameToSave, cvPoint((int)x,(int)y-2), cvPoint((int)x,(int)y+2), CvScalar(255,0,0,0)); } return res; }
void on_mouseclick(int event, int x, int y, int flags, void* param){ IplImage *image = (IplImage*)param; CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1, 1); uchar* ptr; if (event == CV_EVENT_LBUTTONDOWN) { ptr = (uchar*)image->imageData + y * image->widthStep + x * 3; char text[20]; sprintf(text, "%d %d %d", ptr[0], ptr[1], ptr[2]); cvPutText(image, text, cvPoint(x, y), &font, CvScalar(255, 0, 0)); cvShowImage("Window", image); } }
void CvCalibFilter::DrawPoints( CvMat** dstarr ) { int i, j; if( !dstarr ) { assert(0); return; } if( latestCounts ) { for( i = 0; i < cameraCount; i++ ) { if( dstarr[i] && latestCounts[i] ) { CvMat dst_stub, *dst; int count = 0; bool found = false; CvPoint2D32f* pts = 0; GetLatestPoints( i, &pts, &count, &found ); dst = cvGetMat( dstarr[i], &dst_stub ); static const CvScalar line_colors[] = { CvScalar(0,0,255), CvScalar(0,128,255), CvScalar(0,200,200), CvScalar(0,255,0), CvScalar(200,200,0), CvScalar(255,0,0), CvScalar(255,0,255) }; const int colorCount = sizeof(line_colors)/sizeof(line_colors[0]); const int r = 4; CvScalar color = line_colors[0]; CvPoint prev_pt; for( j = 0; j < count; j++ ) { CvPoint pt; pt.x = cvRound(pts[j].x); pt.y = cvRound(pts[j].y); if( found ) { if( etalonType == CV_CALIB_ETALON_CHESSBOARD ) color = line_colors[(j/cvRound(etalonParams[0]))%colorCount]; else color = CV_RGB(0,255,0); if( j != 0 ) cvLine( dst, prev_pt, pt, color, 1, CV_AA ); } cvLine( dst, cvPoint( pt.x - r, pt.y - r ), cvPoint( pt.x + r, pt.y + r ), color, 1, CV_AA ); cvLine( dst, cvPoint( pt.x - r, pt.y + r), cvPoint( pt.x + r, pt.y - r), color, 1, CV_AA ); cvCircle( dst, pt, r+1, color, 1, CV_AA ); prev_pt = pt; } } } } }
void callback(int i) { cvSmooth(frame, imageFiltree, CV_BLUR,seuilFiltre,seuilFiltre,0.0,0.0); cvCvtColor(imageFiltree, imageHSV,CV_BGR2HSV); cvInRangeS(imageHSV,cvScalar(hmin, smin, vmin, 0.0),cvScalar(hmax, smax, vmax, 0.0),imageBinaire); cvErode(imageBinaire, imageErodee, NULL, nbErosions); cvDilate(imageErodee, imageDilatee, NULL, nbDilatations); //imageDilateeFiltree = lowPassFilter(imageDilatee); FILTRE imageObjectRGB = multBinColor(imageDilatee, frame); imageObjectHSV = multBinColor(imageDilatee, imageHSV); // find the centroid of the object and trace it int centroid[2] = {0,0}; centroiding(imageObjectHSV,centroid,2); cvLine(imageObjectHSV, cvPoint(centroid[0]-2,centroid[1]), cvPoint(centroid[0]+2,centroid[1]), CvScalar(255,255,255,0)); cvLine(imageObjectHSV, cvPoint(centroid[0],centroid[1]-2), cvPoint(centroid[0],centroid[1]+2), CvScalar(255,255,255,0)); cvLine(imageObjectRGB, cvPoint(centroid[0]-2,centroid[1]), cvPoint(centroid[0]+2,centroid[1]), CvScalar(255,255,255,0)); cvLine(imageObjectRGB, cvPoint(centroid[0],centroid[1]-2), cvPoint(centroid[0],centroid[1]+2), CvScalar(255,255,255,0)); double distance = findDistance(imageObjectHSV, centroid); //double distance2 = findDistance2(imageObjectHSV, centroid); // Contours cvFindContours( imageDilatee, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0) ); //imageFinale = multiplier(frame/*imageHSV*/, imageDilatee); //cvDrawContours( imageFinale, contours, cvDrawContours( frame, contours, CV_RGB(255,255,0), CV_RGB(0,255,0), 1, 2, 8, cvPoint(0,0)); //cvCvtColor(imageFinale, imageFinale,CV_HSV2BGR); cvNamedWindow(myWindow, CV_WINDOW_AUTOSIZE); cvNamedWindow(myWindowObjectHSV, CV_WINDOW_AUTOSIZE); cvNamedWindow(myWindowObjectRGB, CV_WINDOW_AUTOSIZE); /*cvResizeWindow(myWindowObjectHSV, 500, 400); cvResizeWindow(myWindowObjectRGB, 500, 400); cvMoveWindow(myWindowObjectHSV, 0, 0); cvMoveWindow(myWindowObjectRGB, 515, 0);*/ //cvShowImage(myWindow, imageFinale); cvShowImage(myWindow, frame); cvShowImage(myWindowObjectHSV, imageObjectHSV); cvShowImage(myWindowObjectRGB, imageObjectRGB); }
int main() { //freopen ("myfile.txt","w",stdout); IplImage* background=NULL; //intel image processing libraray IplImage* foreground=NULL; IplImage* subtract=NULL; IplConvKernel* element=NULL; CvCapture* capture=NULL; //info for reading frames from a camera or a video file int counter=0; //show image on screen //cvNamedWindow("Video",CV_WINDOW_AUTOSIZE); //CV_WINDOW_AUTOSIZE is the default video size cvNamedWindow("Subtract",CV_WINDOW_AUTOSIZE); //cvNamedWindow("Contour",CV_WINDOW_AUTOSIZE); IplImage* background_gry ; IplImage* foreground_gry; IplImage* foreground_skipped; IplImage* eroded; IplImage* dilated; IplImage* frame; IplImage* audio; CvRect rect; CvSeq* contours=0; CvMemStorage *storage = cvCreateMemStorage(0); //float ar; //capture = cvCaptureFromCAM(0); capture = cvCaptureFromFile("4.avi"); //takes camera ID as argument /* if( !capture ) { printf("Cannot open camera\n"); return -1; }*/ if(!background) { for(int i=0;i<50;i++) { background=cvQueryFrame(capture); //takes as its argument a pointer to CvCapture structure //grabs next video frame into memory background_gry = cvCreateImage(cvGetSize(background), 8,1); // parameters are size, depth and channels //size is image height and width //depth - bit depth of image elements //channel - no of channels per pixel, supports 1-4 channels eroded = cvCreateImage(cvGetSize(background), 8, 1); dilated = cvCreateImage(cvGetSize(background), 8, 1); frame = cvCreateImage(cvGetSize(background), 8, 1); cvCvtColor(background, background_gry, CV_RGB2GRAY); // converts one color space(no of channels) to another //parameters - input image, output image, color space conversion code } } cvWaitKey(150); //wait and stop for a key stroke subtract= cvCreateImage( cvGetSize(background), 8, 1); IplImage* subtract_gry = cvCreateImage( cvGetSize(background), 8, 1); IplImage* subtract_final = cvCreateImage( cvGetSize(background), 8, 1); while(1) { foreground=cvQueryFrame(capture); //if( !foreground ) break; IplImage* foreground_skipped = cvCreateImage( cvGetSize(foreground), 8, 1); if((counter%5)==0) { foreground_skipped = foreground; //cvNamedWindow("frame", CV_WINDOW_AUTOSIZE); //cvShowImage("frame", foreground); //cvWaitKey(100); foreground_gry= cvCreateImage(cvGetSize(foreground), 8,1); cvCvtColor(foreground, foreground_gry, CV_RGB2GRAY); //cvShowImage( "Video",foreground_gry); char c = cvWaitKey(30); // for(int j=0;c!=27;j++){ //cvSub(foreground,background,subtract,NULL); cvAbsDiff(foreground_gry,background_gry,subtract); //cvCvtColor(subtract, subtract_gry, CV_RGB2GRAY); background_gry = foreground_gry; //cvShowImage( "Background", background_gry ); //double sub_pix= cvGetReal2D(subtract_gry, 150, 100); //printf("\n sub= %lf", sub_pix); cvThreshold(subtract, subtract_final, 15.0, 255.0, CV_THRESH_BINARY); cvErode(subtract_final, eroded, element, 3); cvDilate(eroded, dilated, element, 40); //defining color for drawing contours CvScalar(ext_color); ext_color = CV_RGB(rand()&255, rand()&255, rand()&255); //finding contours for the subtracted image cvFindContours(dilated, storage, &contours, sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); //drawing the contours // for (; contours != 0; contours = contours->h_next) if (contours != 0) { cvDrawContours(dilated, contours, ext_color, CV_RGB(4,2,1), -1, 2, 8); rect = cvBoundingRect(contours, 0); //extract bounding box for current contour //drawing rectangle if( (rect.height * rect.width) < 10000) { contours = contours->h_next; } else { cvRectangle(background, cvPoint(rect.x, rect.y), cvPoint(rect.x+rect.width, rect.y+rect.height), cvScalar(0, 50, 255, 0), 10, 4, 0); //float ar = rect.x/rect.y; float ar = (rect.width-rect.x)/(rect.height-rect.y); printf("\n%2f",ar); printf("\t\t"); //float er = 786432/(((rect.x+rect.width))*((rect.y+rect.height))); //printf("%2f\n",er); //printf("\t\t\t"); float w,v,y,d; float dif=200,cvr; v=0.5; d = pow(rect.width,2.0)+pow(rect.height,2.0); w=pow(d,v); y=w/2; cvr=dif-y; printf("%f\t\t%f\n",y,cvr); dif = y; for(int i=0;i<3;i++) { if(ar<-15) { if(cvr<-75) { //if(rect.width<rect.height) //{ printf("Fall detected \n"); //system("CSmtp.exe"); //PlaySound(TEXT("ring.avi"), NULL, SND_SYNC); //} } } } } //cvBoundingRect(contours,0); cvShowImage("Subtract",background); //cvShowImage("video",background); cvWaitKey(2); // } if( c == 27 ) break; } } counter++; } cvReleaseCapture( &capture ); //cvDestroyWindow("Background"); cvDestroyWindow("Video"); cvDestroyWindow("Subtract"); cvReleaseMemStorage(&storage); return 0; }
void draw() { double scale = this->scale == 0? 1.0 : this->scale; CvScalar colors[5] = { #if !defined CV_VERSION_EPOCH && (CV_VERSION_MAJOR >= 3) CvScalar(cvRound(color[0].r * 255), cvRound(color[0].g * 255), cvRound(color[0].b * 255), cvRound(alpha * 255)), CvScalar(cvRound(color[1].r * 255), cvRound(color[1].g * 255), cvRound(color[1].b * 255), cvRound(alpha * 255)), CvScalar(cvRound(color[2].r * 255), cvRound(color[2].g * 255), cvRound(color[2].b * 255), cvRound(alpha * 255)), CvScalar(cvRound(color[3].r * 255), cvRound(color[3].g * 255), cvRound(color[3].b * 255), cvRound(alpha * 255)), CvScalar(cvRound(color[4].r * 255), cvRound(color[4].g * 255), cvRound(color[4].b * 255), cvRound(alpha * 255)), #else {{cvRound(color[0].r * 255), cvRound(color[0].g * 255), cvRound(color[0].b * 255), cvRound(alpha * 255)}}, {{cvRound(color[1].r * 255), cvRound(color[1].g * 255), cvRound(color[1].b * 255), cvRound(alpha * 255)}}, {{cvRound(color[2].r * 255), cvRound(color[2].g * 255), cvRound(color[2].b * 255), cvRound(alpha * 255)}}, {{cvRound(color[3].r * 255), cvRound(color[3].g * 255), cvRound(color[3].b * 255), cvRound(alpha * 255)}}, {{cvRound(color[4].r * 255), cvRound(color[4].g * 255), cvRound(color[4].b * 255), cvRound(alpha * 255)}}, #endif }; for (int i = 0; i < (objects ? objects->total : 0); i++) { CvRect* r = (CvRect*) cvGetSeqElem(objects, i); CvPoint center; int thickness = stroke <= 0? CV_FILLED : cvRound(stroke * 100); int linetype = antialias? CV_AA : 8; center.x = cvRound((r->x + r->width * 0.5) / scale); center.y = cvRound((r->y + r->height * 0.5) / scale); switch (shape == 1.0? (rand() % 3) : cvRound(shape * 10)) { default: case 0: { int radius = cvRound((r->width + r->height) * 0.25 / scale); cvCircle(image, center, radius, colors[i % 5], thickness, linetype); break; } case 1: { #if !defined CV_VERSION_EPOCH && (CV_VERSION_MAJOR >= 3) CvBox2D box = CvBox2D(CvPoint2D32f(center.x, center.y), CvSize2D32f(r->width / scale, (r->height / scale) * 1.2), 90); #else CvBox2D box = {{center.x, center.y}, {r->width / scale, (r->height / scale) * 1.2}, 90}; #endif cvEllipseBox(image, box, colors[i % 5], thickness, linetype); break; } case 2: { #if !defined CV_VERSION_EPOCH && (CV_VERSION_MAJOR >= 3) CvPoint pt1 = CvPoint(r->x / scale, r->y / scale); CvPoint pt2 = CvPoint((r->x + r->width) / scale, (r->y + r->height) / scale); #else CvPoint pt1 = {r->x / scale, r->y / scale}; CvPoint pt2 = {(r->x + r->width) / scale, (r->y + r->height) / scale}; #endif cvRectangle(image, pt1, pt2, colors[i % 5], thickness, linetype); break; } } } }