OpenCV鼠标绘制矩形和截取矩形区域图像

本文实例为大家分享了OpenCV鼠标绘制截取矩形区域图像的具体代码,供大家参考,具体内容如下

在opencv中利用鼠标绘制矩形,代码如下:

#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#pragma comment( lib, "cv.lib" )
#pragma comment( lib, "cxcore.lib" )
#pragma comment( lib, "highgui.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, 1, 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), 1, 8, 0 );
    cvShowImage( "src", src );
    cvCopy(src,dst);
  }
}
int main()
{
  src=cvLoadImage("lena.jpg",1);
  dst=cvCloneImage(src);
  cvNamedWindow("src",1);
  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, "cv.lib" )
#pragma comment( lib, "cxcore.lib" )
#pragma comment( lib, "highgui.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, 1, 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), 1, 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",1);
    cvShowImage("dst",dst);
    cvSaveImage("dst.jpg",dst);
  }
}
int main()
{
  org=cvLoadImage("lena.jpg",1);
  img=cvCloneImage(org);
  tmp=cvCloneImage(org);
  cvNamedWindow("img",1);
  cvSetMouseCallback( "img", on_mouse, 0 ); 

  cvShowImage("img",img);
  cvWaitKey(0);
  cvDestroyAllWindows();
  cvReleaseImage(&org);
  cvReleaseImage(&img);
  cvReleaseImage(&tmp);
  cvReleaseImage(&dst);
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV使用鼠标响应裁剪图像

    给定一幅图像,将其中的某一部分兴趣区域裁剪出来,这在PS中很好实现,但是使用openCV如何实现呢?因此本文主要介绍openCV使用鼠标响应来裁剪图像: 一.代码部分: #include "stdafx.h" #include "cv.h" #include <highgui.h> #include <stdio.h> IplImage* org = 0; IplImage* img = 0; IplImage* tmp = 0; IplIm

  • OpenCV实现鼠标框选并显示框选区域

    本文实例为大家分享了OpenCV实现鼠标框选并显示框选区域的具体代码,供大家参考,具体内容如下 cvSetImageROI函数(基于给定的矩形设置图像的ROI(感兴趣区域,region of interesting)) void cvSetImageROI(IplImage* image,CvRect rect) 参数: image 图像头,待处理图像 rect ROI 感兴趣区域矩形 cvResetImageROI函数(释放基于给定的矩形设置图像的ROI(感兴趣区域,region of int

  • OpenCV获取鼠标左键点击位置图像的像素值

    本文实现功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 #include<opencv2\opencv.hpp> #include<iostream> using namespace std; using namespace cv; void on_mouse(int EVENT, int x, int y, int flags, void* userdata); void main() { namedWindow("

  • Opencv使用鼠标任意形状的抠图

    本文实例为大家分享了Opencv使用鼠标任意形状抠图的具体代码,供大家参考,具体内容如下 主要的方法思路是:首先利用鼠标在图上画任意形状,利用掩码将任意形状抠出来 主要难点是怎么填充,因为鼠标在画线的时候,滑动越快,点是不连续的,利用floodFill和drawContours都是没有办法进行填充的,从另一个方面想,一个面是由很多个点组成的,虽然鼠标滑动保存下来的就是一系列点,可以利用这一系列点构成一个面,利用面的性质进行填充就比较简单了. 一.首先使用鼠标点击事件,鼠标点击事件的函数为: vo

  • OpenCV鼠标绘制矩形和截取矩形区域图像

    本文实例为大家分享了OpenCV鼠标绘制截取矩形区域图像的具体代码,供大家参考,具体内容如下 在opencv中利用鼠标绘制矩形,代码如下: #include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib,

  • C#使用opencv截取旋转矩形区域图像的实现示例

    前言:最近在工程中需要用到截取RotatedRect中的图形,保存为Mat做后续处理.发现opencv文档中没有这个api,最开始想到的方案是将整张图片进行相应的旋转,然后再从中截取正矩形,但是我们要获取的是部分区域,将整张图片进行旋转会造成很多的资源浪费.所以需要自行实现一个旋转矩形的方案. 实现方法 原理是利用向量空间变换,如图 通过 Point2f[] points=rotatedRect.Points(); 可获取RotatedRect四个端点的坐标.先选定一个点为输出Mat左上端点,这

  • python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)

    最近学了下 python opencv,分享下使用 opencv 在图片上绘制常用图形的方法. 案例中实现了在图片中添加线段.圆形.矩形.椭圆形以及添加文字的方法,使用 opencv2 实现的. 实现方法 1)画线段 cv.line 在图片中绘制一段直线 # 绘制线段 # 参数1:图片 # 参数2:起点 # 参数3:终点 # 参数4:BGR颜色 # 参数5:宽度 cv2.line(img, (60, 40), (90, 90), (255, 255, 255), 2); 参数说明 参数 值 说明

  • OpenCV实现绘制轮廓外接矩形

    目录 1.寻找轮廓 2.绘制轮廓外接矩形 3.代码 1.寻找轮廓 api void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point() 各个参数详解如下: Image表示输入图像,必须是二值图像,二值图像可以threshold输出.Canny输出.inRange输出.自适

  • opencv python截取圆形区域的实现

    目录 一.先进行剪切操作 二.去除背景 总结 一.先进行剪切操作 圆形区域占图片可能不多,多余的部分不要.看下图. 只要纽扣电池内部和少许的边缘部分,其余黑色背景部分不需要.先沿着纽扣电池的边缘剪切出来感兴趣的区域.有2个方法,用寻找轮廓外接圆的方法,或者基尔霍夫圆的方法.在这里以轮廓外接圆方法为例.代码如下: import cv2 import numpy as np image = cv2.imread('F:\Siamese-pytorch-master\datasets\images_b

  • JavaScript canvas绘制渐变颜色的矩形

    本文实例为大家分享了canvas绘制渐变颜色的矩形的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> canvas { border: 1px solid #ccc; } /* .linearGradient{ wi

  • C语言编程使用MATLAB绘制椭圆及圆角矩形

    目录 1 程序说明 椭圆形: 心形: 2 完整代码 不能放图,大家自行绘制试试看. 1 程序说明 这个程序就是用一系列椭圆,圆角矩形及心形拼在起,以下说明一下各部分怎么生成: 椭圆形: 椭圆形是用的如下椭圆数据生成函数生成数据点,之后再用fill函数绘制而成,其中Mu为椭圆中心点,Sigma为协方差矩阵,S为半径平方,pntNum是生成数据点个数: % 椭圆数据计算函数,输入协方差矩阵.中心点.半径生成椭圆数据 % 椭圆数据计算函数,输入协方差矩阵.中心点.半径生成椭圆数据 function [

  • C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制

    目录 理解圆弧绘制 从圆弧到绘制圆角长方体 如何实现等比缩放绘制圆角矩形 按固定比例计算缩放矩形的尝试(不推荐) 通过Inflate()方法缩放矩形 理解圆弧绘制 GDI+中对于圆弧的绘制,是以给定的长方形(System.Drawing.Rectangle 结构)为边界绘制的椭圆的一部分形成的圆弧.绘制的圆弧的中心为长方形内切椭圆的圆心(如果是正方形,则正方形的中心是内切圆的圆心) Graphics对象的DrawArc()方法用于绘制圆弧线段:GraphicsPath对象的AddArc()方法用

  • python cv2截取不规则区域图片实例

    知识掌握 cv2.threshold()函数: 设置固定级别的阈值应用于多通道矩阵,将灰度图像变换二值图像,或去除指定级别的噪声,或过滤掉过小或者过大的像素点. Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst 在其中: src:表示的是图片源 thresh:表示的是阈值(起始值) maxval:表示的是最大值 type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BIN

  • python opencv鼠标画矩形框之cv2.rectangle()函数

    目录 cv2.rectangle()函数说明 参数说明 利用鼠标回调函数交互式画矩形框 总结 关于鼠标回调函数的说明可以参考:opencv-python的鼠标交互操作 cv2.rectangle()函数说明 参数说明 导入cv2后,通过help(cv2.rectangle)可以看到函数的帮助文档如下: rectangle(...) rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img . @brief D

随机推荐