OpenCV选择图像中矩形区域并保存

 更新时间:2020年4月25日 17:26  点击:1477

本文实例为大家分享了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键退出程序。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • python opencv 画外接矩形框的完整代码

    这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • python opencv通过4坐标剪裁图片

    图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
  • OpenCV如何去除图片中的阴影的实现

    这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
  • 解决使用OpenCV中的imread()内存报错问题

    这篇文章主要介绍了解决使用OpenCV中的imread()内存报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • python OpenCV学习笔记

    这篇文章主要介绍了python OpenCV的相关资料,帮助大家更好的理解和学习使用python的opencv,感兴趣的朋友可以了解下...2021-03-31
  • 使用OpenCV去除面积较小的连通域

    这篇文章主要介绍了使用OpenCV去除面积较小的连通域,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-05
  • 详解pycharm的python包opencv(cv2)无代码提示问题的解决

    这篇文章主要介绍了详解pycharm的python包opencv(cv2)无代码提示问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-29
  • 在C#中使用OpenCV(使用OpenCVSharp)的实现

    这篇文章主要介绍了在C#中使用OpenCV(使用OpenCVSharp)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-15
  • C++ opencv实现车道线识别

    这篇文章主要为大家详细介绍了C++ opencv实现车道线识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-20
  • 详解opencv中画圆circle函数和椭圆ellipse函数

    这篇文章主要介绍了opencv中画圆circle函数和椭圆ellipse函数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-09
  • OpenCV-Python实现凸包的获取

    凸包是一个计算几何中的概念,在图像处理过程中,我们常常需要寻找图像中包围某个物体的凸包,本文就使用OpenCV实现,感兴趣的可以了解一下...2021-06-08
  • python中的opencv和PIL(pillow)转化操作

    这篇文章主要介绍了python中的opencv和PIL(pillow)转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • Opencv LBPH人脸识别算法详解

    这篇文章主要为大家详细介绍了Opencv LBPH人脸识别算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • python基于opencv检测程序运行效率

    这篇文章主要介绍了python基于opencv检测程序运行效率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-09
  • python基于OpenCV模板匹配识别图片中的数字

    这篇文章主要介绍了python基于OpenCV模板匹配识别图片中的数字,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-03-31
  • 浅谈OpenCV中的新函数connectedComponentsWithStats用法

    这篇文章主要介绍了浅谈OpenCV中的新函数connectedComponentsWithStats用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-05
  • Opencv实现绿幕视频背景替换功能

    这篇文章主要为大家详细介绍了Opencv实现绿幕视频背景替换功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • Opencv图像处理之详解掩膜mask

    这篇文章主要介绍了Opencv图像处理之详解掩膜mask,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-21
  • 使用opencv识别图像红色区域,并输出红色区域中心点坐标

    这篇文章主要介绍了使用opencv识别图像红色区域,并输出红色区域中心点坐标,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-03
  • python-OpenCV 实现将数组转换成灰度图和彩图

    今天小编就为大家分享一篇python-OpenCV 实现将数组转换成灰度图和彩图,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27