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;
IplImage* dst = 0;
//The mouse cuts the image accordingly
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);
 cvWaitKey(0);
 cvSaveImage("..\\post_img\\71253.jpg",dst);
 }
} 

int _tmain(int argc, _TCHAR* argv[])
{
 org=cvLoadImage("..\\image_norm\\71253.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;
}

二、程序运行效果图:

将鼠标放在原图上的某一点,会显示相应点的位置坐标。至此,openCV使用鼠标响应实现图像裁剪已经实现。

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

(0)

相关推荐

  • 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鼠标绘制截取矩形区域图像的具体代码,供大家参考,具体内容如下 在opencv中利用鼠标绘制矩形,代码如下: #include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib,

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

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

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

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

  • 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实现鼠标在图像上框选单目标和多目标

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 鼠标在图像上框选目标: 1. 用到鼠标回调函数 2. 回调函数里面分三部分 (1)鼠标按下左键 (2)鼠标按下的同时移动左键 (3)鼠标左键弹起 3. 图像显示的刷新 单目标: #include <cv.h> #include <highgui.h> #include <stdio.h> IplImage* src = 0; IplImage* tmp = 0; void on_mou

  • C#实现鼠标裁剪图像功能

    本文实例为大家分享了C#实现鼠标裁剪图像的具体代码,供大家参考,具体内容如下 C#的图像裁剪很容易操作,这里给个实现的例子. 关键是需要处理鼠标的事件和一些更新 实现鼠标移动的代码.注意更新不要全部重画,只有选择矩形部分重画 private void Form1_MouseMove(object sender, MouseEventArgs e) { if (Track_move) endpoint = new Point(e.X, e.Y); else { return; } rect1 =

  • opencv+python实现鼠标点击图像,输出该点的RGB和HSV值

    我就废话不多说了,大家还是直接看代码吧! import cv2 # 读取图片并缩放方便显示 img = cv2.imread('D:/6.jpg') height, width = img.shape[:2] size = (int(width * 0.2), int(height * 0.2)) # 缩放 img = cv2.resize(img, size, interpolation=cv2.INTER_AREA) # BGR转化为HSV HSV = cv2.cvtColor(img, c

  • Python OpenCV实现鼠标画框效果

    使用Python+OpenCV实现鼠标画框的代码,供大家参考,具体内容如下 # -*-coding: utf-8 -*- """ @Project: IntelligentManufacture @File : user_interaction.py @Author : panjq @E-mail : pan_jinquan@163.com @Date : 2019-02-21 15:03:18 """ # -*- coding: utf-8 -

  • opencv3/python 鼠标响应操作详解

    鼠标回调函数: def setMouseCallback( windowName, #窗口名称 onMouse, #鼠标响应处理函数 param=None) #处理函数的ID event鼠标事件: event: EVENT_LBUTTONDBLCLK = 7 左键双击 EVENT_LBUTTONDOWN = 1 左键点击 EVENT_LBUTTONUP = 4 左键释放 EVENT_MBUTTONDBLCLK = 9 中间释放 EVENT_MBUTTONDOWN = 3 中间点击 EVENT_M

  • python opencv实现目标区域裁剪功能

    这个任务是自己在项目中数据处理的一部分内容,待处理的图片如下所示: 我需要将目标区域给裁剪出来,要不然在后期训练网络的时候整幅图像过大,且目标区域过小,得到结果不好,还会加剧计算量.在网上找了各个大佬的博客看,没找到合适的,便自己动手写了,顺便自己的小破站刚搭建起来,记录一下自己的思路. 思路 去寻找目标区域的最左边,最右边,最上面和最下面的像素点,取到坐标信息以后用CV2的裁剪一下就可以实现了. #难点 数据总共是11952张图片,每张图片是1024*768大小的,依次去遍历的话担心太费时间了

  • 超详细注释之OpenCV更改像素与修改图像通道

    这篇博客将介绍使用Python,OpenCV获取.更改像素,修改图像通道,截取图像感兴趣ROI:单通道图,BGR三通道图,四通道透明图,不透明图: 1. 效果图 原图 VS 更改右下某个像素为红色,更改左上角1/4区域为绿色,效果图如下: 裁剪感兴趣区域:分别截取左上角.右上角.左下角.右下角,各占1/4:效果图如下: 原图 VS 图像单通道灰度图效果如下: 左上原图 VS 右上R通道图 VS 左下G通道图 VS 右下B通道图效果如下: 图像4通道 全透明图 VS 不透明效果图: 2. 源码 #

随机推荐