#include // Pour std::cout et std::cin //#include //#include #include // pour que ça marche sur mon systeme #include // idem IplImage *img; // image originale IplImage *imgnvg; // image originale niveau de gris IplImage *imgmed; // image filtrée IplImage *imgdbg; // image pour suivre la selection rectangulaire int r=255, g=255, b=255; // Par défaut, RGB = (255, 255, 255), soit blanc. //int ord1, abs1,abs2, ord2,ord3; CvPoint ptdep,ptfin; //les points de depart (mouse down), de fin (mouse up) bool can_write = false; void refresh() { cvShowImage("mon image2", imgnvg); } void setR(int new_value) { r = new_value; } void setG(int new_value) { g = new_value; } void setB(int new_value) { b = new_value; } void mouseEvents(int event, int x, int y, int flags, void* param) { IplImage* tmp,*mask; //pour faire marcher le cvSmooth avec un equivalent ROI switch(event) { case CV_EVENT_LBUTTONDOWN: case CV_EVENT_RBUTTONDOWN: can_write = true; /* ord1=y; abs1=x; */ ptdep = cvPoint(x,y); break; case CV_EVENT_LBUTTONUP: case CV_EVENT_RBUTTONUP: can_write = false; //abs2=x; ptfin = cvPoint(x,y); tmp = cvCreateImage(cvGetSize(imgmed),8,1); mask = cvCreateImage(cvGetSize(imgmed),8,1); cvRectangle(mask,ptdep,ptfin,CV_RGB(255,255,255),CV_FILLED); cvSmooth(imgnvg, tmp, CV_MEDIAN, 5); // pourrait n'être fait qu'une fois cvCopy(tmp,imgmed,mask); cvShowImage("mon image3", imgmed); cvReleaseImage(&tmp); cvReleaseImage(&mask); break; /* case CV_EVENT_RBUTTONDOWN: can_write = true; case CV_EVENT_RBUTTONUP: can_write = false; ord3=y; break; */ case CV_EVENT_MOUSEMOVE: if(can_write) { //cvCircle(imgnvg, cvPoint(x, y), 1, cvScalar(b, g, r)); cvCopy(img,imgdbg); //restaure l'image cvRectangle(imgdbg,ptdep,cvPoint(x,y),cvScalar(b, g, r)); cvShowImage("mon image2", imgdbg); } break; } //refresh(); } int main() { img = cvLoadImage("lena.jpeg", CV_LOAD_IMAGE_COLOR); imgdbg = cvCloneImage(img); //en couleur pour pouvoir afficher avec le (r,g,b) //IplImage *imgnvg = cvCreateImage(cvGetSize(img), img->depth, 1); // redefinition locale de imgnvg donc pas accessible depuis mouseEvents !! imgnvg = cvCreateImage(cvGetSize(img), img->depth, 1); cvConvertImage(img, imgnvg); //IplImage *imgmed= cvCloneImage(imgnvg); encore une redefinition locale imgmed = cvCloneImage(imgnvg); cvNamedWindow("mon image", CV_WINDOW_AUTOSIZE); cvNamedWindow("mon image2", CV_WINDOW_AUTOSIZE); cvNamedWindow("mon image3", CV_WINDOW_AUTOSIZE); cvCreateTrackbar("red", "mon image2", &r, 255, setR); cvCreateTrackbar("bleu", "mon image2", &b, 255, setR); cvCreateTrackbar("green", "mon image2", &g, 255, setR); cvSetMouseCallback("mon image2", mouseEvents); cvShowImage("mon image", img); cvShowImage("mon image2", imgdbg); cvShowImage("mon image3", imgmed); /* doit etre dans le mouseEvents (mouse up) CvRect rect = cvRect(ord1, abs1, abs2-abs1, ord3-ord2); cvSetImageROI(imgnvg, rect); cvSmooth(imgnvg, imgmed, CV_MEDIAN, 5); */ cvWaitKey(0); cvDestroyAllWindows(); cvReleaseImage(&img); cvReleaseImage(&imgnvg); cvReleaseImage(&imgmed); cvReleaseImage(&imgdbg); return 0; }