本文可以正常运行,请放心使用。
本文参考博客https://blog.csdn.net/pw1623/article/details/88429661,本文系为这篇博客的学习与改进,添加一些详细的注释,弥补原博客的不足之处。
运行结果

程序源代码(附详细注释)

// fangdaPic.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
Mat org;//原图
Mat img;//输出图片
Mat imgROI;//感兴趣区域
Mat roiResize;//感兴趣区域ROI的两倍
Mat tranPart;
int foo = 30;//定义尺寸
int fooResize = 2 * foo;//最终显示放大镜的正方形区域的边长,用作下面if的判断//鼠标回调函数
void on_Mouse(int event, int x, int y, int flag, void*ustc) {//形参x,y是鼠标点击的位置Mat img_temp = img.clone();//临时变量,存放原图//if的作用,x,y是鼠标坐标,限定不能太靠近左上角x > fooResize和 y>fooResize,目的是能让放大镜显示出来。//同时限定不能太靠近右下角x<img_temp.cols - fooResize和 y < img_temp.rows - fooResizeif (x > fooResize && x<img_temp.cols - fooResize && y>fooResize && y < img_temp.rows - fooResize) {//感兴趣区域范围imgROI = img_temp(Rect(x - foo, y - foo, 2 * foo, 2 * foo));//以(x,y)为中心,左右为foo做正方形//tranPart是最后显示放大的区域,这里tranPart = img_temp(Range(y - 2 * foo, y + 2 * foo), Range(x - 2 * foo, x + 2 * foo));//Range表示纵、横坐标的范围//感兴趣区域放大两倍,需要和tranPart的尺寸搭配。可调,但是注意不能超过图片本身范围。resize(imgROI, roiResize, Size(2 * imgROI.cols, 2 * imgROI.rows));//输出到roiResize这个Mat对象中roiResize.copyTo(tranPart);//复制到tranPart这个Mat对象中//标注鼠标的位置circle(img_temp, Point(x, y), 10, Scalar(0, 0, 255), 1, 8, 0);//画一个简单的圆imshow("img", img_temp);//显示窗口}
}int main() {org = imread("1.jpg");//读取图片,此图片位于同一路径下img = org.clone();namedWindow("img");//创建opencv窗口imshow("img", img);//在窗口显示图片setMouseCallback("img", on_Mouse, 0);//调用鼠标回调函数waitKey(0);
}

对代码的进一步解释
大家可能对setMouseCallback()这个函数有点陌生。下面解释一下。如下转到定义我们可以看到。
setMouseCallback有三个形参,第一个是const String&类型的变量,需要填写窗口的名称,我们这里是“img”。
第二个形参是MouseCallBack类型的回调函数,第三个形参是void*类型的userdata=0采用默认值。

CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);/** @brief Gets the mouse-wheel motion delta, when handling mouse-wheel events cv::EVENT_MOUSEWHEEL and
cv::EVENT_MOUSEHWHEEL.在处理鼠标滚轮事件时,获取鼠标滑轮的移动变化。For cv::EVENT_MOUSEWHEEL positive and negative values mean forward and backward scrolling,
respectively.      EVENT_MOUSEWHEEL正负值意味着向前滚或者向后滚。For cv::EVENT_MOUSEHWHEEL, where available, positive and negative values mean right and
left scrolling, respectively.
With the C API, the macro CV_GET_WHEEL_DELTA(flags) can be used alternatively.
有c接口的地方,这个标志可以替代使用。
@noteMouse-wheel events are currently supported only on Windows.
鼠标滚轮事件目前只支持windows系统
@param flags The mouse callback flags parameter.鼠标回调标志参数*/

void on_Mouse(int event, int x, int y, int flag, void*ustc) ;
这里的on_Mouse函数一般需要event参数,表示处理事件,在我们的图片局部放大中,我们主要使用的形参是鼠标的坐标(x,y),其他几个变量没有涉及。

总结一下,我们的步骤主要分为以下几步。

第一步,复制到新的临时变量中Mat img_temp = img.clone();//临时变量,存放原图
第二步,考虑最终局部放大的尺寸,限定鼠标位置(x,y)。if (x > fooResize && x<img_temp.cols - fooResize && y>fooResize && y < img_temp.rows - fooResize)
第三步,绘制最初的感兴趣区域ROI,这里是待放大的地方。imgROI = img_temp(Rect(x - foo, y - foo, 2 * foo, 2 * foo));//以(x,y)为中心,左右为foo做正方形
第四步,设置放大后显示的地方与尺寸。tranPart = img_temp(Range(y - 2 * foo, y + 2 * foo), Range(x - 2 * foo, x + 2 * foo));//Range表示纵、横坐标的范围,此处是ROI区域的两倍,需要自己画图体会
第五步,感兴趣区域ROI放大,放到tranPart中。resize(imgROI, roiResize, Size(2 * imgROI.cols, 2 * imgROI.rows));//输出到roiResize这个Mat对象中
roiResize.copyTo(tranPart);//复制到tranPart这个Mat对象中
第六步,显示inshow即可。

opencv图片局部放大镜相关推荐

  1. jquery图片局部放大镜特效

    部分代码(完整包见资源下载链接) 注:资源上传时默认付费,可以私信我,我看到会回复的 <!DOCTYPE html> <html><head><meta ch ...

  2. 图片局部放大镜,可在大图上下左右移动并放大对应的区域

    现实中使用放大镜可以放大对应的区域,软件中有时候也会用到放大镜功能,比如图片上某一点看不清楚,你不需要将整张图片都放大,只需要放大你想看到的部分,这个时候放大镜就派上用场了. 1.实现原理 如何实现放 ...

  3. 抖音短视频系统开发图片局部放大镜,可在大图上下左右移动并放大对应的区域

    如何实现放大镜的原理呢?一种方式我们可以采用将原图中的局部区域提取裁剪,然后在图片顶层的自定义控件上放大对应的倍数展示即可:另外一个种方式是将整图都放大相应的倍数,然后截取需要显示的区域,间接实现放大 ...

  4. opencv图片线性混合可调

    opencv图片线性混合叠加.addWeighted()函数 直接上效果图 通过滚动条选择不同的透明值,使得两张图片进行不同程度的线性混合. 主要的代码是这句:addWeighted()函数 //根据 ...

  5. 2020-12-03 Python OpenCV: 图片的裁剪

    Python OpenCV: 图片的裁剪 图片裁剪使用img[y0:y1, x0:x1],其中参数分别代表y轴和x轴的起始坐标,具体使用方法如下: import cv2img = cv2.imread ...

  6. 马赛克 php,php实现图片局部打马赛克的方法

    本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...

  7. Html之实例练习(轮播图片、放大镜效果、面板拖动)

    文章目录 一.轮播图片 二.放大镜效果 三.面板拖动 本篇将简单演示一下HTML里的轮播图片.放大镜效果和面板拖动的实例,代码已经打包在文章开头,需要参考的请自行下载 一.轮播图片 1.效果图 2.J ...

  8. python+freetype+opencv 图片中文(汉字)显示 详细图文教程和项目完整源代码

    opencv图片写入中文(汉字)有两方法: 方法一: python+opencv+freetype https://blog.csdn.net/wyx100/article/details/75579 ...

  9. java opencv 阀值分割_利用OpenCV实现局部动态阈值分割

    利用OpenCV实现局部动态阈值分割,参考Halcon dyn_threshold算子的思路实现. #include "dialog.h" #include #include &q ...

最新文章

  1. 常见BIOS设置解析
  2. c语言sgoto 标志位,如何在Go中设置TCP数据包的“不分段”标志位?(How to set “don't fragment” flag bit for TCP packet in Go?)...
  3. 进行java环境设置的原因_java环境变量的设置原因
  4. iis8 php mysql zend,强烈推荐windows 2012 iis8 fastcgi php5.2.17 zend mysql
  5. Lync 小技巧-53-Windows 2012 R2-加域-电脑-自动-登录
  6. UTrust4701F双界面NFC读写器读卡器测试软件读写NFC电子标签的文本|网址|电子名片|智能海报|蓝牙地址内容操作说明
  7. java去除音频无声_java – 使用FFMPEG和silencedetect删除音频静音
  8. SVN主干合并到分支
  9. Visual Studio 2013 各个版本的产品密钥
  10. FAT文件系统与文件恢复
  11. Android开发常用的模拟器
  12. 微信公众号上传图文素材thumb_media_id的获得
  13. 计算机模拟技术在高分子领域的应用,模拟技术的原理、方法及在高分子材料研究中的应用...
  14. NBUT1582 比赛吃鸡腿
  15. Springboot餐饮点餐系统毕业设计源码301749
  16. Vim中快速定位到某一行的方法
  17. python判断输入的是否为数字_python怎么判断是否为数字 将罗马数字转为阿拉伯数字,用python解...
  18. 并发编程:我对Java并发编程的总结和思考
  19. 高光谱目标检测论文学习(2)——OSP Using Data Sphering and LRaSMD for HTD
  20. 数字电路:硬件描述语言AHDL纵览

热门文章

  1. 小红书直播功能如何用 小红书app直播功能使用方法【详解】
  2. std::string 去除前后空格
  3. 2021搜狗k站神器 搜狗举报违规站点工具
  4. 2019/07/21_后生动物转录因子的早期进化 Early evolution of metazoan transcription factors_(lab paper)
  5. Kubernetes中Pod的调度策略
  6. Docker学习,Docker常见命令
  7. 前端Array.prototype.map()使用案例和forEach使用接口案例
  8. C语言课设设备管理系统(大作业)
  9. 推荐几本免费的Linux电子书
  10. 【Ubuntu18配置Anaconda深度学习环境】