该代码通过鼠标选取左上角和右下角两个点,并基于这两个点实现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区域像素值相同化相关推荐

  1. Opencv鼠标回调函数

    1.目的 读取一张图片,在该图片上截取一个ROI区域,将截取的图像在新窗口显示,并可以保存至工程目录下. 2.实现环境 C++.VS2017.opencv 3.回调函数原理 回调函数就是一个通过函数指 ...

  2. (OpenCV+Python)--图片局部区域像素值处理(改进版)

    上一个版本看这里:<Python+OpenCV实现[图片]局部区域像素值处理> 上个版本的代码虽然实现了我需要的功能,但还是走了很多弯路,我意识到图片本就是数组形式,对于8位灰度图,通道数 ...

  3. Python Opencv 实现鼠标事件(包含一个练习)——事件触发讲解·以及鼠标回调函数的实现

    文章目录 鼠标事件概述 鼠标事件发生的结构 鼠标回调函数的标准格式 opencv下包含的所有事件--包含flag和event(可以看一下,熟悉常见事件范围) 鼠标事件的实现函数 一个完整的鼠标事件由一 ...

  4. 【opencv系列05】OpenCV4.X鼠标回调函数

    点击上方"AI搞事情"关注我们 一.回调函数 setMouseCallback(windowName, onMouse, param=None) windowName:窗口名称 o ...

  5. 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析

    [OpenCV入门教程之四] ROI区域图像叠加&初级图像混合 全剖析 浅墨_毛星云 2014-03-10 12:48:05 157425 收藏 19 最后发布:2014-03-10 12:4 ...

  6. c语言鼠标怎么获取像素,OpenCV获取鼠标左键点击位置图像的像素值

    本文实现功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 #include #include using namespace std; using ...

  7. matlab显示像素分布,MATLAb-----7--------如何动态显示鼠标的坐标值和图像像素值

    MATLAB如何动态显示鼠标的坐标值和图像像素值 http://apps.hi.baidu.com/share/user/41caedc2bda36d61746c6162330a (1)fix(x) ...

  8. 实战解惑 | OpenCV中如何提取不规则ROI区域

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 什么是ROI ROI是英文Region Of Interest的三 ...

  9. OpenCV中如何提取不规则ROI区域, 手眼标定hand_eye_calibration

    opencv提取ROI区域: 在做这个之前,首先来了解一下什么图像处理中的mask(遮罩),OpenCV中是如此定义Mask的:八位单通道的Mat对象,每个像素点值为零或者非零区域.当Mask对象添加 ...

  10. opencv将Mat读入的图像的像素值打印在控制台上

    //将Mat读入的图像像素值打印在控制台上,这里的Img为单通道 方法一:cv::Mat Img; IplImage *src;src=&IplImage(Img);for(int i=0;i ...

最新文章

  1. php 对数据转换成tree,PHP 把返回的數據集轉換成Tree樹
  2. java数组split_js数组接受split(java split)
  3. 关于Xcode6编译变更 “Implicit declaration of function 'sysctl' is invalid in C99” 报错问题
  4. C++之类型萃取技巧
  5. 大剑无锋之你所知道的列式数据库有哪些?列式数据库的好处在哪?【面试推荐】
  6. 产品铭牌要求_AMPULM:电力变压器铭牌有哪些主要技术参数,你都知道吗?
  7. 用php web编程作业,用PHP进行Web编程.ppt
  8. python的类和对象_Python面向对象之类和对象实例详解
  9. Python学习插曲之万年历算法
  10. 100%正确率识别票据从金融领域切入挖掘文字识别的巨大价值
  11. TS在vue中的应用
  12. 有道云笔记不同步_不怕误同步 有道云笔记历史记录教程
  13. FreeRTOS-时间片与任务阻塞的实现
  14. Scratch官方教程中文版(2)——制作可交互的生日贺卡
  15. python turtle 太极八卦图
  16. 【English】十大词性之连词
  17. 安全修复之Web——【中危】启用了不安全的TLS1.0、TLS1.1协议
  18. Hadoop安全之Kerberos
  19. 关于Recycle.exe病毒的分析
  20. 计算机专业复试简历超实用

热门文章

  1. ArcGIS Server 10.1发布数据源为ArcSDE(直连)的MXD【转】
  2. usaco1.5.3(sprime)
  3. oracle 简单job
  4. 在vs编辑器里走来走去的快捷键
  5. .NET现成程序给你用[四]
  6. 微信小程序——通过百度API查询天气情况
  7. 消息队列技术终结者(一)—通俗深刻地认识JMS(即Java Message Service)
  8. SqlServer中使用游标进行双重遍历
  9. html文档元素两部分,html元素
  10. python与vb可以互换吗_VB6+Python混合编程(COM组件)(转)