OpenCV选择图像中矩形区域并保存
本文实例为大家分享了OpenCV选择图像中矩形区域并保存的具体代码,供大家参考,具体内容如下
根据《LearningOpenCV》中的example4.1改写:
//Anexampleprograminwhichthe //usercandrawboxesonthescreen. // //#include//#include #include"opencv2/imgproc/imgproc.hpp" #include"opencv2/highgui/highgui.hpp" usingnamespacecv; //Defineourcallbackwhichwewillinstallfor //mouseevents. // voidmy_mouse_callback( intevent,intx,inty,intflags,void*param ); CvRectbox; booldrawing_box=false; boolisRectDrawn=false; //Alittesubroutinetodrawaboxontoanimage_copy voiddraw_box(IplImage*img,CvRectrect){ cvRectangle( img, cvPoint(box.x,box.y), cvPoint(box.x+box.width,box.y+box.height), cvScalar(0x00,0x00,0xff)/*blue*/ ); } voiddraw_box_green(IplImage*img,CvRectrect){ cvRectangle( img, cvPoint(box.x,box.y), cvPoint(box.x+box.width,box.y+box.height), cvScalar(0x00,0xff,0x00)/*green*/ ); } intmain(intargc,char*argv[]){ box=cvRect(-1,-1,0,0); IplImage*image_input=cvLoadImage(argv[1]); IplImage*image=cvCloneImage(image_input); IplImage*image_copy=cvCloneImage(image); IplImage*temp=cvCloneImage(image_copy); cvNamedWindow("BoxExample"); //Hereisthecrucialmomentthatweactuallyinstall //thecallback.Notethatwesetthevalue‘param'to //betheimage_copyweareworkingwithsothatthecallback //willhavetheimage_copytoedit. // cvSetMouseCallback( "BoxExample", my_mouse_callback, (void*)image_copy ); //Themainprogramloop.Herewecopytheworkingimage_copy //tothe‘temp'image_copy,andiftheuserisdrawing,then //putthecurrentlycontemplatedboxontothattempimage_copy. //displaythetempimage_copy,andwait15msforakeystroke, //thenrepeat… // while(1){ //cvCopyImage(image_copy,temp); cvCopy(image_copy,temp); if(drawing_box)draw_box(temp,box); cvShowImage("BoxExample",temp); //if(cvWaitKey(15)==27)break; intkey=cvWaitKey(15); if(key==27)break; if(isRectDrawn){ if(key=='s'||key=='S'){ //drawgreenbox draw_box_green(image_copy,box); cvCopy(image_copy,image); //saveroiimage staticintindex=0; charsave_image_name[128]; sprintf(save_image_name,"rect_%d.jpg",index++); cvSetImageROI(image_input,box); cvSaveImage(save_image_name,image_input); cvResetImageROI(image_input); isRectDrawn=false; } if(key=='q'||key=='Q'){ cvCopy(image,image_copy); isRectDrawn=false; } } } //Betidy // cvReleaseImage(&image_copy); cvReleaseImage(&temp); cvDestroyWindow("BoxExample"); } //Thisisourmousecallback.Iftheuser //pressestheleftbutton,westartabox. //whentheuserreleasesthatbutton,thenwe //addtheboxtothecurrentimage_copy.Whenthe //mouseisdragged(withthebuttondown)we //resizethebox. // voidmy_mouse_callback( intevent,intx,inty,intflags,void*param ){ IplImage*image_copy=(IplImage*)param; switch(event){ caseCV_EVENT_MOUSEMOVE:{ if(drawing_box){ box.width=x-box.x; box.height=y-box.y; } } break; caseCV_EVENT_LBUTTONDOWN:{ drawing_box=true; box=cvRect(x,y,0,0); } break; caseCV_EVENT_LBUTTONUP:{ drawing_box=false; isRectDrawn=true; if(box.width<0){ box.x+=box.width; box.width*=-1; } if(box.height<0){ box.y+=box.height; box.height*=-1; } draw_box(image_copy,box); } break; } }
使用方法:
载入图像后,用鼠标在图像上点击确定矩形起始点,拖动鼠标画矩形,抬起鼠标键时会画出一个红色矩形区域。按下s或S键,红色矩形变成绿色,并保存这个ROI区域。如果按下q或Q键,将会取消这次选择,红色矩形框消失。可以连续选取多个区域。按ESC键退出程序。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。