用鼠标截取矩形图像并保存(1)

         

    摘要:继上一个实验,实现用鼠标截 取矩形图像并保存。 


   关键字:copyTo


    copyTo最一般的用法是src.copyTo(img),将src复制到img矩阵中。



实验代码如下: 


#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <stdio.h>  

using namespace cv;

Mat src, dst, img, tmp, dst1, dst2, dst3, dst4,dst5;
void on_mouse(int event, int x, int y, int flags, void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags表示拖拽和键盘操作 
{
static Point pre_pt = (-1, -1);//初始坐标  
static Point cur_pt = (-1, -1);//实时坐标  
char temp[16];
if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标,并在图像上该点处划圆  
{
src.copyTo(img);//将原始图片复制到img中  
sprintf(temp, "(%d,%d)", x, y);//格式化字符串 
pre_pt = Point(x, y);//获取当前点坐标值 
putText(img, temp, pre_pt, FONT_HERSHEY_SIMPLEX, 0.5,Scalar(0,0,0,225), 1, 8);//在窗口上显示坐标  
circle(img, pre_pt, 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆  
imshow("img", img);
}
else if (event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))移动的处理
//左键没有按下的情况下鼠标 函数  

{
img.copyTo(tmp);//将img复制到临时图像tmp上,用于显示实时坐标  
sprintf(temp, "(%d,%d)", x, y);
cur_pt = Point(x, y);
putText(tmp, temp, cur_pt, FONT_HERSHEY_SIMPLEX, 0.5,Scalar(0, 0, 0,225));//只是实时显示鼠标移动的坐标  
imshow("img", tmp);


}
else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))//左键按下时,鼠标移动,则在图像上划矩形  
{
img.copyTo(tmp);
sprintf(temp, "(%d,%d)", x, y);
cur_pt = Point(x, y);
putText(tmp, temp, cur_pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0,0,0,225) );
rectangle(tmp, pre_pt, cur_pt, Scalar(0, 255, 0, 0), 1, 8, 0);//在临时图像上实时显示鼠标拖动时形成的矩形  
imshow("img", tmp);



}
else if (event == CV_EVENT_LBUTTONUP)//左键松开,将在图像上划矩形  
{
src.copyTo(img);
sprintf(temp, "(%d,%d)", x, y);
cur_pt = Point(x, y);
putText(img, temp, cur_pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0,0,225));
circle(img, pre_pt, 2, Scalar(0,225,0,0), CV_FILLED, CV_AA, 0);//绘圆
rectangle(img, pre_pt, cur_pt, Scalar(0, 255, 0, 0), 1, 8, 0);//根据初始点和结束点,将矩形画到img上  
   imshow("img", img);

   img.copyTo(tmp);




//截取矩形包围的图像,并保存到输出
图像中  

int width = abs(pre_pt.x - cur_pt.x);//两点的横坐标的差
int height = abs(pre_pt.y - cur_pt.y);//两点的纵坐标的差
if (width == 0 || height == 0)
{
printf("width == 0 || height == 0");//如果横坐标的差值和纵坐标的差值中有一个为0,则销毁窗口
return;
}

               //鼠标截取矩形并显示
dst = src(Rect(min(cur_pt.x, pre_pt.x), min(cur_pt.y, pre_pt.y), width, height));
namedWindow("dst");
imshow("dst", dst);


dst1 = src(Rect(min(cur_pt.x, pre_pt.x), min(cur_pt.y, pre_pt.y), width+61, height));
namedWindow("dst1");
imshow("dst1", dst1);

dst2 = src(Rect(min(cur_pt.x , pre_pt.x ), min(cur_pt.y, pre_pt.y), width+154, height));
namedWindow("dst2");
imshow("dst2", dst2);

dst3 = src(Rect(min(cur_pt.x , pre_pt.x ), min(cur_pt.y, pre_pt.y), width+220, height));
namedWindow("dst3");
imshow("dst3", dst3);

dst4 = src(Rect(min(cur_pt.x , pre_pt.x ), min(cur_pt.y, pre_pt.y), width+275, height));
namedWindow("dst4");
imshow("dst4", dst4);

dst5= src(Rect(min(cur_pt.x, pre_pt.x ), min(cur_pt.y, pre_pt.y), width+349, height));
namedWindow("dst5");
imshow("dst5",dst5);


waitKey(0);

}
}
void main()
{
src = imread("001.bmp");//读入图像 
src.copyTo(img);
src.copyTo(tmp);
namedWindow("img");//定义一个img窗口  
setMouseCallback("img", on_mouse, 0);//调用回调函数  
imshow("img", img); // 显示图像

waitKey(0);
}




实验结果如下截图所示:



  实验小结:

    1.由实验结果可知,实验达到了用鼠标截取矩形区域并保存的目的,函数实现了通过横坐标和纵坐标的距离截取所需图案,而且横坐标之差和纵坐标之差还是通过运行结果鼠标所显示的坐标计算出来的, 但是还没达到将每个字符截取后一次性全部单个显示出来。

     2.综合上两次的实验,问题主要出现在OpenCv1.0和OpenCv3.0的 混用,在网上参考的东西比较杂,连1.0和3.0版本都没有区分出来,所以学习方式还有待改进。

猜你喜欢

转载自blog.csdn.net/HHCCWWlxy/article/details/78745887