/*
* =====================================================================================
*
* Filename: select2save.cpp
* Description: 获取感兴趣的选区,自动创建目录和resize大小
* 环境:opencv2.4.4和vs2010
*
*
* Version: 2
* Created: 2013/10/14 19:52:09
* Author: yuliyang
* Weibo: @礼杨_HDU
* Mail: wzyuliyang911@gmail.com
* Blog: http://www.cnblogs.com/yuliyang
*
* =====================================================================================
*/
#include "opencv\cv.h"
/*-----------------------------------------------------------------------------
* 很奇怪的的是cvresize()在这个头文件里,加了它才有定义,否则编译会说函数未定义
*-----------------------------------------------------------------------------*/
#include "opencv\highgui.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
#include <math.h>
using namespace cv;
IplImage* org = ;
IplImage* img = ;
IplImage* tmp = ;
IplImage* dst = ;
IplImage* dst_resize = ;
static int n=;
static char savename[];
static char savename_resize[];
void on_mouse( int event, int x, int y, int flags, void* ustc)
{
static CvPoint pre_pt = {-,-};
static CvPoint cur_pt = {-,-};
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, , , CV_AA);
char temp[];
char lenth_and_height[];
if( event == CV_EVENT_LBUTTONDOWN )
{
cvCopy(org,img);
sprintf(temp,"(%d,%d)",x,y);
pre_pt = cvPoint(x,y);
cvPutText(img,temp, pre_pt, &font, cvScalar(,, , ));
cvCircle( img, pre_pt, ,cvScalar(,,,) ,CV_FILLED, CV_AA, );
cvShowImage( "img", img );
cvCopy(img,tmp);
}
else if( event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))
{
cvCopy(tmp,img);
sprintf(temp,"(%d,%d)",x,y);
cur_pt = cvPoint(x,y);
cvPutText(img,temp, cur_pt, &font, cvScalar(,, , ));
cvShowImage( "img", img );
}
else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
{
cvCopy(tmp,img);
sprintf(temp,"(%d,%d)",x,y);
cur_pt = cvPoint(x,y);
cvPutText(img,temp, cur_pt, &font, cvScalar(,, , ));
cvRectangle(img, pre_pt, cur_pt, cvScalar(,,,), , , );
sprintf(lenth_and_height,"(Width:%d,Height:%d)",abs(cur_pt.x-pre_pt.x),abs(cur_pt.y-pre_pt.y));
/*-----------------------------------------------------------------------------
*
*
* 为了方便随时查看自己选区的宽度和高度,特意加了一个点,该点计算为取矩形窗左上点和右下点的中点
*
*
*-----------------------------------------------------------------------------*/
CvPoint origin;
origin.x=(pre_pt.x+cur_pt.x)/;
origin.y=(pre_pt.y+cur_pt.y)/;
cvPutText(img,lenth_and_height, origin, &font, cvScalar(,, , ));
cvShowImage( "img", img );
}
else if( event == CV_EVENT_LBUTTONUP )
{
cvCopy(tmp,img);
sprintf(temp,"(%d,%d)",x,y);
cur_pt = cvPoint(x,y);
cvPutText(img,temp, cur_pt, &font, cvScalar(,, , ));
cvCircle( img, cur_pt, ,cvScalar(,,,) ,CV_FILLED, CV_AA, );
cvRectangle( img, pre_pt, cur_pt, cvScalar(,,,), , , );
cvShowImage( "img", img );
cvCopy(img,tmp);
int width=abs(pre_pt.x-cur_pt.x);
int height=abs(pre_pt.y-cur_pt.y);
if(width== || height==)
{
cvDestroyWindow("dst");
return;
}
dst=cvCreateImage(cvSize(width,height),org->depth,org->nChannels);
CvRect rect;
if(pre_pt.x<cur_pt.x && pre_pt.y<cur_pt.y)
{
rect=cvRect(pre_pt.x,pre_pt.y,width,height);
}
else if(pre_pt.x>cur_pt.x && pre_pt.y<cur_pt.y)
{
rect=cvRect(cur_pt.x,pre_pt.y,width,height);
}
else if(pre_pt.x>cur_pt.x && pre_pt.y>cur_pt.y)
{
rect=cvRect(cur_pt.x,cur_pt.y,width,height);
}
else if(pre_pt.x<cur_pt.x && pre_pt.y>cur_pt.y)
{
rect=cvRect(pre_pt.x,cur_pt.y,width,height);
}
cvSetImageROI(org,rect);
cvCopy(org,dst);
/*-----------------------------------------------------------------------------
* 定义保存图像的大小
*-----------------------------------------------------------------------------*/
CvSize dst_cvsize;
dst_cvsize.width=;
dst_cvsize.height=;
dst_resize = cvCreateImage( dst_cvsize, org->depth, org->nChannels);
cvResize(org, dst_resize, CV_INTER_LINEAR);
cvResetImageROI(org);
cvDestroyWindow("dst");
//cvNamedWindow("dst",1);
//cvShowImage("dst",dst);
/*-----------------------------------------------------------------------------
* 保存未resize的图像
*-----------------------------------------------------------------------------*/
sprintf(savename,".\\picture\\save%03d.bmp",n);
/*-----------------------------------------------------------------------------
* 保存在resize文件夹下
*-----------------------------------------------------------------------------*/
sprintf(savename_resize,".\\picture_resize\\save%03dr.bmp",n);
cvSaveImage(savename,dst);
cvSaveImage(savename_resize,dst_resize);
n++;
}
}
int main(int argc, char *argv[])
{
/*-----------------------------------------------------------------------------
* 用DOS命令创建文件夹,用于分类resize和未resize的原图像
*-----------------------------------------------------------------------------*/
system("md .\\picture_resize");
system("md .\\picture");
org=cvLoadImage(argv[],);
img=cvCloneImage(org);
tmp=cvCloneImage(org);
cvNamedWindow("img",);
cvSetMouseCallback( "img", on_mouse, );
cvShowImage("img",img);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&org);
cvReleaseImage(&img);
cvReleaseImage(&tmp);
cvReleaseImage(&dst);
return ;
}