OpenCV选择图像中矩形区域并保存
本文实例为大家分享了OpenCV选择图像中矩形区域并保存的具体代码,供大家参考,具体内容如下
根据《Learning OpenCV》中的example4.1改写:
// An example program in which the // user can draw boxes on the screen. // //#include <cv.h> //#include <highgui.h> #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" using namespace cv; // Define our callback which we will install for // mouse events. // void my_mouse_callback( int event, int x, int y, int flags, void* param ); CvRect box; bool drawing_box = false; bool isRectDrawn = false; // A litte subroutine to draw a box onto an image_copy void draw_box( IplImage* img, CvRect rect ) { cvRectangle ( img, cvPoint(box.x,box.y), cvPoint(box.x+box.width,box.y+box.height), cvScalar(0x00,0x00,0xff) /* blue */ ); } void draw_box_green( IplImage* img, CvRect rect ) { cvRectangle ( img, cvPoint(box.x,box.y), cvPoint(box.x+box.width,box.y+box.height), cvScalar(0x00,0xff,0x00) /* green */ ); } int main( int argc, 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( "Box Example" ); // Here is the crucial moment that we actually install // the callback. Note that we set the value ‘param' to // be the image_copy we are working with so that the callback // will have the image_copy to edit. // cvSetMouseCallback( "Box Example", my_mouse_callback, (void*) image_copy ); // The main program loop. Here we copy the working image_copy // to the ‘temp' image_copy, and if the user is drawing, then // put the currently contemplated box onto that temp image_copy. // display the temp image_copy, and wait 15ms for a keystroke, // then repeat… // while( 1 ) { //cvCopyImage( image_copy, temp ); cvCopy( image_copy, temp ); if( drawing_box ) draw_box( temp, box ); cvShowImage( "Box Example", temp ); //if( cvWaitKey( 15 )==27 ) break; int key = cvWaitKey( 15 ); if(key == 27) break; if(isRectDrawn){ if(key == 's' || key == 'S'){ // draw green box draw_box_green( image_copy, box ); cvCopy( image_copy, image ); // save roi image static int index = 0; char save_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; } } } // Be tidy // cvReleaseImage( &image_copy ); cvReleaseImage( &temp ); cvDestroyWindow( "Box Example" ); } // This is our mouse callback. If the user // presses the left button, we start a box. // when the user releases that button, then we // add the box to the current image_copy. When the // mouse is dragged (with the button down) we // resize the box. // void my_mouse_callback( int event, int x, int y, int flags, void* param ) { IplImage* image_copy = (IplImage*) param; switch( event ) { case CV_EVENT_MOUSEMOVE: { if( drawing_box ) { box.width = x-box.x; box.height = y-box.y; } } break; case CV_EVENT_LBUTTONDOWN: { drawing_box = true; box = cvRect(x, y, 0, 0); } break; case CV_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键退出程序。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 01-10用c语言实现冒泡排序,选择排序,快速排序
- 01-10堆排序算法(选择排序改进)
- 01-10实现opencv图像裁剪分屏显示示例
- 01-10使用opencv拉伸图像扩大分辨率示例
- 01-10VC++实现选择排序算法简单示例
- 01-10C++基于Directx MMX实现的图像灰度转换代码
- 01-10Cocos2d-x中使用CCScrollView来实现关卡选择实例
- 01-10C++选择排序算法实例
- 01-10C++选择文件夹代码的封装
- 01-10C++将CBitmap类中的图像保存到文件的方法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery
- 01-10C#中split用法实例总结