opencv鼠标回调函数实现ROI区域像素值相同化
该代码通过鼠标选取左上角和右下角两个点,并基于这两个点实现ROI区域的选取,ROI区域内所有像素值被赋予左上角选取点的像素值。
源代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
#include<opencv.hpp>
#include<cmath>using namespace cv;
using namespace std;cv::Mat org_, dst_, img_, tmp_;
int pointValue;
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)//左键按下,读取初始坐标,并在图像上该点处划圆 {pointValue=0;org_.copyTo(img_);//将原始图片复制到img中 cout << img_.rows << " " << img_.cols << endl;sprintf(temp, "(%d,%d)", x, y);pre_pt = Point(x, y);pointValue = img_.at<Vec3b>(pre_pt)[0];cout << pointValue<<endl;/* cout << org.at<Vec3b>(pre_pt)[1];cout << org.at<Vec3b>(pre_pt)[2];*///初始坐标//putText(org_, temp, pre_pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255), 1, 8);//在窗口上显示坐标 //circle(org_, pre_pt, 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆 imshow("img", org_);}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(org_, temp, cur_pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));//只是实时显示鼠标移动的坐标 imshow("img", org_);}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(org_, temp, cur_pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));rectangle(tmp_, pre_pt, cur_pt, Scalar(0, 255, 0, 0), 1, 8, 0);//在临时图像上实时显示鼠标拖动时形成的矩形 imshow("img", tmp_);}else if (event == CV_EVENT_LBUTTONUP)//左键松开,将在图像上划矩形 {org_.copyTo(img_);sprintf(temp, "(%d,%d)", x, y);cur_pt = Point(x, y);int height_ = abs(cur_pt.x - pre_pt.x);int width_ = abs(cur_pt.y - pre_pt.y);//Mat imageBlue, imageGreen, imageRed;Mat imageBlue = Mat::zeros(img_.rows, img_.cols, CV_8UC1);Mat imageGreen = Mat::zeros(img_.rows, img_.cols, CV_8UC1);Mat imageRed = Mat::zeros(img_.rows, img_.cols, CV_8UC1);Mat mergeImage;Mat test0,test1,test2;vector<Mat> channelrgb;Mat mer;//putText(org_, temp, cur_pt, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));//circle(org_, pre_pt, 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);split(img_, channelrgb);imageBlue = channelrgb.at(0);imageGreen = channelrgb.at(1);imageRed = channelrgb.at(2);cout << imageRed.rows<<" "<<imageRed.cols<< endl;if ((cur_pt.x > pre_pt.x) && (cur_pt.y > pre_pt.y)){for (int i = 0; i < (cur_pt.x - pre_pt.x); i++){for (int j = 0; j <(cur_pt.y - pre_pt.y); j++){imageBlue.at<uchar>(j + pre_pt.y, i + pre_pt.x) = pointValue;imageGreen.at<uchar>(j + pre_pt.y, i + pre_pt.x) = pointValue;imageRed.at<uchar>(j + pre_pt.y, i + pre_pt.x) = pointValue;}}}channelrgb.at(0) = imageBlue;channelrgb.at(1) = imageGreen;channelrgb.at(2) = imageRed;test0 = channelrgb.at(0);test1 = channelrgb.at(1);test2 = channelrgb.at(2);merge(channelrgb, org_);cout << "cui" << endl;//截取矩形包围的图像,并保存到dst中 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");return;}dst_ = org_(Rect(min(cur_pt.x, pre_pt.x), min(cur_pt.y, pre_pt.y), width, height));//namedWindow("merge", 0);//imshow("merge", org_);imwrite("C:\\Users\\new\\Desktop\\test.bmp", org_);waitKey(0);}
}void main()
{org_ = imread("C:/Users/new/Desktop/1.bmp");namedWindow("img",0);//定义一个img窗口 setMouseCallback("img", on_mouse, 0);//调用回调函数 //imshow("img", img_);cv::waitKey(0);
}
实验结果
opencv鼠标回调函数实现ROI区域像素值相同化相关推荐
- Opencv鼠标回调函数
1.目的 读取一张图片,在该图片上截取一个ROI区域,将截取的图像在新窗口显示,并可以保存至工程目录下. 2.实现环境 C++.VS2017.opencv 3.回调函数原理 回调函数就是一个通过函数指 ...
- (OpenCV+Python)--图片局部区域像素值处理(改进版)
上一个版本看这里:<Python+OpenCV实现[图片]局部区域像素值处理> 上个版本的代码虽然实现了我需要的功能,但还是走了很多弯路,我意识到图片本就是数组形式,对于8位灰度图,通道数 ...
- Python Opencv 实现鼠标事件(包含一个练习)——事件触发讲解·以及鼠标回调函数的实现
文章目录 鼠标事件概述 鼠标事件发生的结构 鼠标回调函数的标准格式 opencv下包含的所有事件--包含flag和event(可以看一下,熟悉常见事件范围) 鼠标事件的实现函数 一个完整的鼠标事件由一 ...
- 【opencv系列05】OpenCV4.X鼠标回调函数
点击上方"AI搞事情"关注我们 一.回调函数 setMouseCallback(windowName, onMouse, param=None) windowName:窗口名称 o ...
- 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析
[OpenCV入门教程之四] ROI区域图像叠加&初级图像混合 全剖析 浅墨_毛星云 2014-03-10 12:48:05 157425 收藏 19 最后发布:2014-03-10 12:4 ...
- c语言鼠标怎么获取像素,OpenCV获取鼠标左键点击位置图像的像素值
本文实现功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 #include #include using namespace std; using ...
- matlab显示像素分布,MATLAb-----7--------如何动态显示鼠标的坐标值和图像像素值
MATLAB如何动态显示鼠标的坐标值和图像像素值 http://apps.hi.baidu.com/share/user/41caedc2bda36d61746c6162330a (1)fix(x) ...
- 实战解惑 | OpenCV中如何提取不规则ROI区域
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 什么是ROI ROI是英文Region Of Interest的三 ...
- OpenCV中如何提取不规则ROI区域, 手眼标定hand_eye_calibration
opencv提取ROI区域: 在做这个之前,首先来了解一下什么图像处理中的mask(遮罩),OpenCV中是如此定义Mask的:八位单通道的Mat对象,每个像素点值为零或者非零区域.当Mask对象添加 ...
- opencv将Mat读入的图像的像素值打印在控制台上
//将Mat读入的图像像素值打印在控制台上,这里的Img为单通道 方法一:cv::Mat Img; IplImage *src;src=&IplImage(Img);for(int i=0;i ...
最新文章
- php 对数据转换成tree,PHP 把返回的數據集轉換成Tree樹
- java数组split_js数组接受split(java split)
- 关于Xcode6编译变更 “Implicit declaration of function 'sysctl' is invalid in C99” 报错问题
- C++之类型萃取技巧
- 大剑无锋之你所知道的列式数据库有哪些?列式数据库的好处在哪?【面试推荐】
- 产品铭牌要求_AMPULM:电力变压器铭牌有哪些主要技术参数,你都知道吗?
- 用php web编程作业,用PHP进行Web编程.ppt
- python的类和对象_Python面向对象之类和对象实例详解
- Python学习插曲之万年历算法
- 100%正确率识别票据从金融领域切入挖掘文字识别的巨大价值
- TS在vue中的应用
- 有道云笔记不同步_不怕误同步 有道云笔记历史记录教程
- FreeRTOS-时间片与任务阻塞的实现
- Scratch官方教程中文版(2)——制作可交互的生日贺卡
- python turtle 太极八卦图
- 【English】十大词性之连词
- 安全修复之Web——【中危】启用了不安全的TLS1.0、TLS1.1协议
- Hadoop安全之Kerberos
- 关于Recycle.exe病毒的分析
- 计算机专业复试简历超实用
热门文章
- ArcGIS Server 10.1发布数据源为ArcSDE(直连)的MXD【转】
- usaco1.5.3(sprime)
- oracle 简单job
- 在vs编辑器里走来走去的快捷键
- .NET现成程序给你用[四]
- 微信小程序——通过百度API查询天气情况
- 消息队列技术终结者(一)—通俗深刻地认识JMS(即Java Message Service)
- SqlServer中使用游标进行双重遍历
- html文档元素两部分,html元素
- python与vb可以互换吗_VB6+Python混合编程(COM组件)(转)