Opencv學習筆記——畫矩形

通過Opencv自帶的函數功能cvRectangle來實現用鼠標畫矩形,具體代碼如下:

#include "stdio.h"
#include "highgui.h"
#include "cv.h"
void my_mouse_callback(int event,int x,int y,int flags,void *param);
CvRect box;
/*
typedef struct CvRect
{
    int x;
    int y;
    int width;
    int height;
}
CvRect;
*/
bool drawing_box=false;
//畫矩形函數
void draw_box(IplImage *img,CvRect rect)
{
	cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00));
/*	函數原型:void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int thickness=1, int line_type=8, int shift=0 );
參數介紹:
img -- 圖像.
pt1 -- 矩形的一個頂點。
pt2 -- 矩形對角線上的另一個頂點
color -- 線條顏色 (RGB) 或亮度(灰度圖像 )(grayscale image)。
thickness -- 組成矩形的線條的粗細程度。取負值時(如 CV_FILLED)函數繪製填充了色彩的矩形。
line_type -- 線條的類型。見cvLine的描述
shift -- 座標點的小數點位數。*/
}

int main(int argc, char* argv[])
{
	box=cvRect(-1,-1,0,0);
	IplImage *image=cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3);
	cvZero(image);
	//將圖像中的數組清零
	IplImage *temp=cvCloneImage(image);
	//clone是把所有的都複製過來,也就是說不論你是否設置Roi,Coi等影響copy的參數,clone都會原封不動的克隆過來。
    //copy就不一樣,只會複製ROI區域等。用clone複製之後,源圖像在內存中消失後,複製的圖像也變了,而用copy複製,源圖像消失後,複製的圖像不變
	cvNamedWindow("Box Example");
	cvSetMouseCallback("Box Example",my_mouse_callback,(void*)image);
	while(1)
	{
		cvCopyImage(image,temp);
		if(drawing_box)
		{
			draw_box(temp,box);
					}
		cvShowImage("Box Example",temp);
		if(cvWaitKey(15)==27)
			//接收到ESC按鍵
		{
			break;
		}
		
	}
	cvReleaseImage(&image);
		cvReleaseImage(&temp);
		cvDestroyWindow("Box Example");
	printf("Hello World!\n");
	return 0;
}

//響應畫矩形
void my_mouse_callback(int event,int x,int y,int flags,void *param)
{
	IplImage *image=(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;
			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,box);
		}
		break;
	}
}


發佈了45 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章