文档章节

在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域

moki_oschina
 moki_oschina
发布于 2015/01/15 22:48
字数 757
阅读 1247
收藏 2

这是两个相关的程序,前者是后者的基础。实际上前一个程序也是在前面博文的基础上做的修改,请参考《在OpenCV中利用鼠标绘制直线》 。下面贴出代码。

程序之一,在OpenCV中利用鼠标绘制矩形

#include "stdafx.h"
#include <cv.h>  
#include <highgui.h>  
#include <stdio.h> 
//#pragma comment( lib, "cv.lib" )  
//#pragma comment( lib, "cxcore.lib" )  
//#pragma comment( lib, "highgui.lib" ) 
#pragma comment(lib, "opencv_core247.lib" )   
#pragma comment(lib, "opencv_core247d.lib" )   
#pragma comment(lib, "opencv_highgui247.lib" )  
#pragma comment(lib, "opencv_highgui247d.lib" )
IplImage* src = 0;       
IplImage* dst = 0;         
void on_mouse( int event, int x, int y, int flags, void* ustc)                        
{                
 static CvPoint pre_pt = {-1,-1};          
 static CvPoint cur_pt = {-1,-1};      
 CvFont font;           
 cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 2, CV_AA); 
 char temp[16];  
 if( event == CV_EVENT_LBUTTONDOWN ) 
 {                                                                                         cvCopy(dst,src); 
  sprintf(temp,"(%d,%d)",x,y);
  pre_pt = cvPoint(x,y); 
  cvPutText(src,temp, pre_pt, &font, cvScalar(0,0, 0, 255));
  cvCircle( src, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 ); 
  cvShowImage( "src", src );
  cvCopy(src,dst);   
 }           
 else if( event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))
 {                              
  cvCopy(dst,src);         
  sprintf(temp,"(%d,%d)",x,y);
  cur_pt = cvPoint(x,y);     
  cvPutText(src,temp, cur_pt, &font, cvScalar(0,0, 0, 255));
  cvShowImage( "src", src );  
 }          
 else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
 {                                 
  cvCopy(dst,src);      
  sprintf(temp,"(%d,%d)",x,y); 
  cur_pt = cvPoint(x,y);   
  cvPutText(src,temp, cur_pt, &font, cvScalar(0,0, 0, 255)); 
  cvRectangle(src, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, 8, 0 ); 
  cvShowImage( "src", src );    
 }                        
 else if( event == CV_EVENT_LBUTTONUP )
 {                                 
  sprintf(temp,"(%d,%d)",x,y);  
  cur_pt = cvPoint(x,y);       
  cvPutText(src,temp, cur_pt, &font, cvScalar(0,0, 0, 255));
  cvCircle( src, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
  cvRectangle( src, pre_pt, cur_pt, cvScalar(0,255,0,0), 5, 8, 0 ); 
  cvShowImage( "src", src );                                   
  cvCopy(src,dst);             
 }            
}               
 
int _tmain(int argc, _TCHAR* argv[])
{
 src=cvLoadImage("st110.jpg",-1);                                
 dst=cvCloneImage(src);                                        
 cvNamedWindow("src",0);                                       
 cvSetMouseCallback( "src", on_mouse, 0 );                    
 cvShowImage("src",src);                                       
 cvWaitKey(0);                                                 
 cvDestroyAllWindows();                                        
 cvReleaseImage(&src);                                         
 cvReleaseImage(&dst);                                        
 
 return 0;
}

程序之二,在OpenCV中利用鼠标绘制矩形并截取该矩形区域的图像

#include <cv.h>  
#include <highgui.h>  
#include <stdio.h> 
#pragma comment(lib, "opencv_core247.lib" )   
#pragma comment(lib, "opencv_core247d.lib" )   
#pragma comment(lib, "opencv_highgui247.lib" )  
#pragma comment(lib, "opencv_highgui247d.lib" )
IplImage* org = 0;                         
IplImage* img = 0;                         
IplImage* tmp = 0;                         
IplImage* dst = 0;                         
void on_mouse( int event, int x, int y, int flags, void* ustc)
{                                         
 static CvPoint pre_pt = {-1,-1};       
 static CvPoint cur_pt = {-1,-1};       
 CvFont font;                           
 cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 2, CV_AA); 
 char temp[16];  
 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(0,0, 0, 255)); 
  cvCircle( img, pre_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );
  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(0,0, 0, 255));  
  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(0,0, 0, 255)); 
  cvRectangle(img, pre_pt, cur_pt, cvScalar(0,255,0,0), 1, 8, 0 ); 
  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(0,0, 0, 255));
  cvCircle( img, cur_pt, 3,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );  
  cvRectangle( img, pre_pt, cur_pt, cvScalar(0,255,0,0), 5, 8, 0 );
  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==0 || height==0)          
  {                                  
   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);                   
  cvResetImageROI(org);              
  cvDestroyWindow("dst");            
  cvNamedWindow("dst",0);            
  cvShowImage("dst",dst);            
  cvSaveImage("dst.jpg",dst);        
 }                                                                                                                             
}                                                                                                                                
int _tmain(int argc, _TCHAR* argv[])
{
 org=cvLoadImage("st110.jpg",-1);                      
 img=cvCloneImage(org);                              
 tmp=cvCloneImage(org);                              
 cvNamedWindow("img",0);                             
 cvSetMouseCallback( "img", on_mouse, 0 );          
 cvShowImage("img",img);                             
 cvWaitKey(0);                                       
 cvDestroyAllWindows();                             
 cvReleaseImage(&org);                              
 cvReleaseImage(&img);                              
 cvReleaseImage(&tmp);                              
 cvReleaseImage(&dst);                             
 return 0;
}

本文转载自:http://www.cnblogs.com/lidabo/p/3316729.html

moki_oschina
粉丝 26
博文 202
码字总数 44864
作品 0
成都
程序员
私信 提问
使用OpenCV和Python拼接图像

写在前面 首先这是一篇英文博客的翻译,先放上链接:https://www.pyimagesearch.com/2018/12/17/image-stitching-with-opencv-and-python/ 翻译是靠谷歌翻译和自己的理解,个别地方翻译有点问...

W_Tortoise
2018/12/19
0
0
图片人脸检测(OpenCV版)

图片人脸检测 人脸检测使用到的技术是OpenCV,上一节已经介绍了OpenCV的环境安装,点击查看. 功能展示 识别一种图上的所有人的脸,并且标出人脸的位置,画出人眼以及嘴的位置,展示效果图如下...

vipstone
2018/05/21
0
0
我为什么要写《OpenCV Android 开发实战》这本书

我为什么要写《OpenCV Android 开发实战》这本书 2015年我出版了个人第一本关于图像处理方面的书籍《Java图像处理-编程技巧与应用实践》,这本书主要是从理论与编码上面详细阐述了图像处理基...

gloomyfish
2018/07/06
0
0
基于QT和OpenCV的人脸识别系统

1 系统方案设计 1.1 引言 人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控、出入口控制、视频会议以及...

宫不上叔
2014/07/24
0
2
(三)OpenCV中的图像处理之图像变换及模板匹配

注释:本文翻译自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括对原文档种错误代码的纠正 3.10 OpenCV中的图像变换 第一节:傅里叶变换(Fourier Transform) 1.目标 使用OpenCV查找图...

u014403318
2018/05/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅教程:如何获取精准客源,提高销量

经常有人问嗅嗅,我是XX行业的,大数据能帮我做什么? • 可以给我带来客源吗? • 可以提高我的销量吗? • 可以增加我的利润吗? 今天嗅嗅就以生鲜供货为例,为大家讲一讲外卖平台那些事~...

forespider
26分钟前
1
0
浮窗插件

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>移动窗口</title> <style> body { margin: 0; padding: 0; width: 100%; height: 1000px; background: #eee; } /*示......

流年那么伤
30分钟前
2
0
关于 Jenkins master 共享 JENKINS_HOME 目录的实验

本文首发于:Jenkins 中文社区 作者:翟志军 审校:王冬辉,linuxsuren Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的...

Jenkins中文社区
38分钟前
3
0
【重构】Spring Cloud OAuth 无Token调用源码封装

背景 重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。 书接上回Spring Security OAuth 微服务内部Token传递的源码解析,本篇主要无token 调用过程中,代码的不断完善及其重...

冷冷gg
43分钟前
26
0
watchOS更新后 Apple Watch 4心电图功能已开始支持欧洲用户

苹果在发布 Apple Watch 4 系列时也发布了 ECG(心电图)功能,但这项功能仅适用于在美版 Apple Watch。对于其他地区的用户来说,访问该功能的唯一途径是在美国购买该设备。不过当 watchOS ...

linuxCool
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部