国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

OpenCV選擇圖像中矩形區域并保存

2020-01-26 13:33:35
字體:
來源:轉載
供稿:網友

本文實例為大家分享了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_copyvoid 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鍵退出程序。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 贡山| 芦山县| 邹城市| 肥乡县| 静安区| 阳原县| 遵义县| 额济纳旗| 崇信县| 金阳县| 长子县| 大田县| 镶黄旗| 綦江县| 闽清县| 崇义县| 祁阳县| 开阳县| 河北区| 景泰县| 孟村| 育儿| 阳山县| 东辽县| 玉树县| 泾源县| 得荣县| 永春县| 五莲县| 林芝县| 称多县| 普格县| 招远市| 桐庐县| 德江县| 固镇县| 嘉黎县| 宁阳县| 河源市| 柏乡县| 景谷|