學習javacv之七:在畫布上,畫矩形邊框

package com.csdn.linghu.javacvlean04;

import org.bytedeco.javacpp.Pointer;
import org.bytedeco.javacpp.opencv_core.CvRect;
import org.bytedeco.javacpp.opencv_core.IplImage;

import static org.bytedeco.javacpp.opencv_highgui.*;
import static org.bytedeco.javacpp.opencv_core.*;

public class DrawRect {
	//JCVMouseCallBack:繼承類CvMouseCallback,重寫call方法,以便於在cvSetMouseCallback(...)進行回調
	static JCVMouseCallBack jcvMouseCallBack = new JCVMouseCallBack();
	public static void main(String[] args) {
		//初始化畫圖區域
		IplImage image = cvCreateImage(cvSize(640, 360), IPL_DEPTH_8U, 3);
		//將畫圖區域置爲0(矩陣)
		cvZero(image);
		IplImage temImage = cvCloneImage(image);
		//新建窗口顯示畫圖區域
		cvNamedWindow( "DrawRebBox" );
		//設置鼠標回調函數,以響應鼠標事件
		cvSetMouseCallback("DrawRebBox", jcvMouseCallBack, image);
		 while(true) {
			 cvCopy(image, temImage);
			 if(jcvMouseCallBack.isDrawBox()){
				 //在temImage畫布內,顯示鼠標事件所畫的圖像
				 drawBox(temImage, jcvMouseCallBack.getBox());
				 //將圖片保存到文件
				 cvSaveImage("resources/drawRect.jpg", temImage);
			 } 
			 cvShowImage("DrawRebBox", temImage);
			 //按ESC鍵退出(ESC鍵對應的ASCII值爲27)
			 if(cvWaitKey( 15 )==27) {
				 break; 
			 }
			  }
		  //釋放資源
		  cvReleaseImage(image);
		  cvReleaseImage(temImage);
		  cvDestroyWindow("DrawRebBox");
	}
	public static void drawBox(IplImage image,CvRect cvRect){
		 cvRectangle (
				 //image作爲畫布顯示矩形
				 image, 
				 //矩形的左上角座標位置
				 cvPoint(jcvMouseCallBack.getBox().x(),jcvMouseCallBack.getBox().y()),
				 //矩形右下角座標位置
				 cvPoint(jcvMouseCallBack.getBox().x()+jcvMouseCallBack.getBox().width(),jcvMouseCallBack.getBox().y()+jcvMouseCallBack.getBox().height()),
				 //邊框的顏色
				 CV_RGB(255, 0, 0),
				 //線條的寬度:正值就是線寬,負值填充矩形,例如CV_FILLED,值爲-1
				 1,
				 //線條的類型(0,8,4)
				 4,
				 //座標的小數點位數
				 0
				  );
	}
}
/**
 * @功能說明:重寫call(...)方法,實現函數回調
 * @time:2014年7月18日下午4:30:06
 * @version:1.0
 *
 */
class JCVMouseCallBack extends CvMouseCallback{
	//初始化box
	CvRect box = cvRect(-1, -1, 0, 0);
	//是否在畫圖的標識
	boolean drawBox = false;
	@Override
	/*
	 * 參數說明(non-Javadoc)
	 * @see org.bytedeco.javacpp.opencv_highgui.CvMouseCallback#call(int, int, int, int, org.bytedeco.javacpp.Pointer)
	 * envent:鼠標事件代碼0(鼠標移動),1(左鍵按下),4(左鍵放開),還有別的。
	 * x:鼠標在畫布上的x座標
	 * y:鼠標在畫布上的y座標
	 * flags:是否有鼠標事件
	 */
	public void  call(int event, int x, int y, int flags, Pointer pointer){
		 //處理鼠標事件
		switch (event) {
			//鼠標左鍵按下
			case CV_EVENT_LBUTTONDOWN: {
				drawBox = true;
				//以鼠標按下的點爲左上角的定點,在畫布上畫矩形
				box = cvRect(x, y, 0, 0);
			}
			break;
			//鼠標移動
			case CV_EVENT_MOUSEMOVE: {
				//鼠標左鍵被按下,開始畫圖
				if (drawBox) {
					box.width(x - box.x());
					box.height(y - box.y());
				}
			}
			break;
			//鼠標左鍵放開
			case CV_EVENT_LBUTTONUP: {
				drawBox = false;
			}
			break;
		}
	}
	public CvRect getBox() {
		return box;
	}
	public void setBox(CvRect box) {
		this.box = box;
	}
	public boolean isDrawBox() {
		return drawBox;
	}
	public void setDrawBox(boolean drawBox) {
		this.drawBox = drawBox;
	}
}

結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章