OpenCV選擇圖像中矩形區(qū)域并保存
本文實例為大家分享了OpenCV選擇圖像中矩形區(qū)域并保存的具體代碼,供大家參考,具體內容如下
根據《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;
}
}
使用方法:
載入圖像后,用鼠標在圖像上點擊確定矩形起始點,拖動鼠標畫矩形,抬起鼠標鍵時會畫出一個紅色矩形區(qū)域。按下s或S鍵,紅色矩形變成綠色,并保存這個ROI區(qū)域。如果按下q或Q鍵,將會取消這次選擇,紅色矩形框消失。可以連續(xù)選取多個區(qū)域。按ESC鍵退出程序。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10用c語言實現(xiàn)冒泡排序,選擇排序,快速排序
- 01-10堆排序算法(選擇排序改進)
- 01-10實現(xiàn)opencv圖像裁剪分屏顯示示例
- 01-10使用opencv拉伸圖像擴大分辨率示例
- 01-10VC++實現(xiàn)選擇排序算法簡單示例
- 01-10C++基于Directx MMX實現(xiàn)的圖像灰度轉換代碼
- 01-10Cocos2d-x中使用CCScrollView來實現(xiàn)關卡選擇實例
- 01-10C++選擇排序算法實例
- 01-10C++選擇文件夾代碼的封裝
- 01-10C++將CBitmap類中的圖像保存到文件的方法


閱讀排行
本欄相關
- 04-02c語言函數(shù)調用后清空內存 c語言調用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求
隨機閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結


