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;
}
}
結果: