关于opencv:opencv高斯滤波

1.获取原图大小img = cv2.imread("text.jpg")h, w = img.shape[:2]测试图片是一张256×256×3的图片 2.图像补0#设置卷积核大小K_size = 3pad = K_size // 2out = np.zeros((h + pad * 2, w + pad * 2, 3), dtype=np.cfloat)out[pad: pad + h, pad: pad + w] = img.copy().astype(np.cfloat)若K_size = 21,图像就会在四周补充20个像素的0: 3.创立高斯卷积核#设置标准差sigmasigma = 1.3K = np.zeros((K_size, K_size), dtype=np.cfloat) for x in range(-pad, -pad + K_size): for y in range(-pad, -pad + K_size): K[y + pad, x + pad] = np.exp(-(x ** 2 + y ** 2) / (2 * (sigma ** 2)))K /= (2 * np.pi * sigma * sigma)K /= K.sum()4.进行高斯滤波tmp = out.copy() for y in range(h): for x in range(w): for z in range(3): out[pad + y, pad + x, z] = np.sum(K * tmp[y: y + K_size, x: x + K_size, z])out = np.clip(out, 0, 255)out = out[pad: pad + H, pad: pad + W].astype(np.uint8)当卷积核的大小为3,标准差为1.3时: ...

August 28, 2023 · 1 min · jiezi

关于opencv:numpy灰度可视化

1.创立一个800 * 800的矩形图img = np.zeros([800, 800], dtype=np.uint8)灰度图的亮度值依照规定应该是0~255总计256个值,相当于把从黑到白分循序变动分为了256个阶段,我上面所做的操作就是显示这256个阶段,不同灰度值的图像。 2.对256个区域赋予不同灰度值for i in range(16): for j in range(16): x = i * 50 y = j * 50 s = j + i * 16 img[x : x + 47, y : y + 47] = s失去了256个区域,按区域划分蕴含有16个行和16个列,每区域的像素大小为50 × 50,其中48 × 48个像素区域赋予灰度值,灰度值同一行逐步加一,同一列逐步加16,失去上面这张蕴含所有灰度值的图(0~255),共256个灰度: 冲破255的灰度可视化 for i in range(10): for j in range(26): x = i * 50 y = j * 50 s = j + i * 26 img[x: x + 47, y: y + 47] = s % 256当灰度值超过255时能够通过取余,使得右下角灰度值应该为256~259的区域变为0~4: ...

August 26, 2023 · 1 min · jiezi

关于opencv:关于人脸识别opencv和深度学习

对于人脸识别、opencv和深度学习这篇文章次要是 介绍下这三者的关系 还有从几个大的方面 能够说是宏观角度介绍下OpenCV 前言没有接触过这些的人可能搞不清楚他们的关系,咱们从人脸识别来说,人脸识别大家都晓得,支付宝刷脸、高铁火车进站刷脸,这些技术让咱们生存更加便当 就比如说以前进站要工作人员一个个看证件检票 当初设置几个闸机刷脸安检就ok了 所以说技术的呈现就是为了不便人们的生存 一说到人脸识别,你要辨认的话首先你得从图像中框出人脸才行,然而这其中又有很多问题,就比方进站的时候是间接应用闸机上摄像头的实时画面的截图,因为高矮胖瘦人脸部占比不同,而且脸的朝向角度、站的地位远近都会导致最终拍摄的图像品质产生差别。因而,人脸识别的第一步,是辨认人脸,光这一步就足够难倒不少英雄汉。前面的辨认过程就更不用说,须要兼顾准确性和效率,辨认不准当然不行,但为了准,辨认太久,让大家排着长队等也是不行的,难以兼顾。然而! OpenCV呈现了,当然OpenCV可不止可能做人脸识别 人脸识别只是它其中一小部分 字面意思来看 open是开 凋谢的 开源的 CV就是计算机视觉 computer vision计算机视觉方向也是深度学习外面 一个热门方向 计算机视觉这个词听起来高深莫测,艰深点来说就是钻研咱们平时闲着无聊瞎琢磨的图片和视频 其实图像和视频从技术角度来看是一回事。一段视频按时间轴拉开来,其实就是很多张的图像,咱们常说的视频帧,其实就是一张图像的意思。所以,以后计算机视觉最外围钻研对象,就是图像处理。 而后 计算机视觉和opencv的关系 opencv是计算机视觉外面 一个很火的工具 而且opencv比深度学习呈现得更早上面次要介绍 OpenCV (1)什么是OpenCv通过下面的介绍 大家都大略晓得OpenCV是一个开源的计算机视觉和机器学习库,其余方面来说,它能够运行在Linux Windows 和Android等操作系统上,轻量且高效,是有一系列C函数和C++类形成的 ,他也提供了python matlab等语言的接口 可能实现很多图像处理的算法 (2)计算机视觉软件计算机视觉方面没有规范的api 计算机视觉软件大抵能分为上面三种:①本人钻研代码 然而钻研过程慢,不稳固 还可能与其余库不兼容②商业化工具 比方Halcon Matlab+Simulink 这些 然而商业化工具 有肯定消耗③依赖硬件的解决方案 比方视频监控 控制系统 医疗设施 opencv致力于成长为简化计算机视觉程序和解决方案的规范api 一方面 它优化代码进步了执行速度 另一方面 依赖硬件 失去更高的处理速度(IPPICV减速 英特尔的集成性能基元(IPP)库 opencv3.0时领有了一个收费的IPP库的字库 称为IPPICV 你用的是英特尔处理器时 会主动调用IPPICV 放慢解决)PS: 对于opencv 和 Halcon (3)OpenCV利用场景①图像分类 或者叫图像识别 辨认图像中物体属于什么类别人脸识别 : 人脸方面的利用还是很多的 包含人脸识别 人脸匹配 人脸对齐等等 这也是计算机视觉很火的一个方向 当初广泛应用 ...

February 27, 2023 · 1 min · jiezi

关于opencv:基于OpenCV的人脸视频文字检测以及识别的项目一-项目准备

本文次要是对于人脸、视频、文字检测以及辨认的我的项目筹备opencv环境搭建 次要是 装置python+ numpy模块+opencv 1.配置python环境对于在vscode中配置python环境 比较简单 能够看这位大佬 很具体https://blog.csdn.net/qq_4546... 2装置numpy+opencv (他俩装置办法雷同)numpy是一个定义了数值数组和矩阵类型和它们的根本运算的语言扩大,OpenCV援用了numpy模块,所以装置OpenCV之前必须装置numpy。numpy:第一步:先去网站下载对应的numpy版本,这个numpy要对应你的python版本号 下载地址:https://www.lfd.uci.edu/~gohl...第二步 下载当前 间接cmd 执行命令 pip install d:\numpy\numpy_stl-2.17.1-cp311-cp311-win_amd64.whl//注: 我的python 是下的最新的3.11 所以对应numpy-cp311 install前面跟的是 你下载的文件门路 opencv:同样,先网站下载OpenCV对应的.whl版本压缩包,对应版本的 网址:https://www.lfd.uci.edu/~gohl... 而后cmd 运行命令 pip install d:\opencv-python\opencv_python-4.5.5-cp311-cp311-win_amd64.whl3.vscode上走一走而后就能够关上你的vscode创立 .py文件ok 简简单单环境配好了 本我的项目学习自:该大佬 https://github.com/vipstone/f...我的项目:https://github.com/vipstone/f...

February 19, 2023 · 1 min · jiezi

关于opencv:公众号接入-chatGPT-教程附源码

> 申明:本文仅供技术交换应用,浏览本文需具备肯定的开发能力 前置筹备一个域名一台服务器一个公众号域名配置在你的域名服务商新建二级域名并绑定服务器主机IP 服务器配置上传上面的python文件到你的服务器,并批改代码段中相应地位代码(token、api-key、port) import timefrom flask import Flask,make_response,requestimport openaifrom flask import Flask, requestfrom flask_caching import Cacheimport xml.etree.cElementTree as ETimport hashlibimport requestsimport reimport oscnt = 0my_wx_token = "" # 自定义字母和数字组合即可,后续须要填入公众号后盾my_gpt_key = "" # 这里填写你在OpenAI后盾创立的API-KEYmy_switch_chatgpt = Trueapp = Flask(__name__)env_dist = os.environcache = Cache(app, config={'CACHE_TYPE': 'simple', "CACHE_DEFAULT_TIMEOUT": 30})@app.route('/',methods=['GET','POST'])def wechat(): if request.method == 'GET': signature = request.args.get("signature", "") timestamp= request.args.get("timestamp", "") nonce= request.args.get("nonce", "") echostr= request.args.get("echostr", "") print(signature, timestamp, nonce, echostr) token=my_wx_token data =[token, timestamp, nonce] data.sort() temp = ''.join(data) sha1 = hashlib.sha1(temp.encode('utf-8')) hashcode=sha1.hexdigest() print(hashcode) if hashcode == signature: print("wechat commit check OK") return echostr else: print("GET error input msg") return "error-return\r\n" else: xmlData = ET.fromstring(request.stream.read()) msg_type = xmlData.find('MsgType').text if msg_type == 'text': ToUserName = xmlData.find('ToUserName').text FromUserName = xmlData.find('FromUserName').text CreateTime = xmlData.find('CreateTime').text print(ToUserName) print(FromUserName) print(CreateTime) global cnt cnt += 1 print('-------> ' + str(cnt)) return generate_response_xml(FromUserName, ToUserName, xmlData.find('Content').text) def text_reply(FromUserName, ToUserName, output_content): reply = ''' <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml> ''' response = make_response(reply % (FromUserName, ToUserName, str(int(time.time())), output_content)) response.content_type = 'application/xml' return responsedef generate_response_xml(FromUserName, ToUserName, input_content): output_content = generate_response(input_content) return text_reply(FromUserName, ToUserName, output_content)outofsevice_txt = "道歉,<a href=\"https://mp.weixin.qq.com/s/0LN37YiERJgMyvIDpzRcAQ\">攻城狮杰森的ChatGPT服务助手</a>正在保护中,临时无奈预估保护持续时间,请今天再来尝试吧。"@cache.memoize(timeout=60)def generate_response(prompt): if not my_switch_chatgpt: return outofsevice_txt openai.api_key = my_gpt_key response = openai.Completion.create( model="text-davinci-003", prompt=prompt, temperature=0, max_tokens=1024, top_p=1, frequency_penalty=0.0, presence_penalty=0.0, ) message = response.choices[0].text print(message) ans = message.strip() return ans if __name__ == '__main__': app.run(host='0.0.0.0', port=xxxx, debug=True)#凋谢xxxx端口应用宝塔是比拟快捷的配置形式,装置宝塔面板后,进入软件商店,装置上面两个插件 ...

February 16, 2023 · 2 min · jiezi

关于opencv:谈谈如何使用-opencv-进行图像识别

原文由hakaboom发表于TesterHome社区,点击原文链接可与作者间接交换。1)前言从18年开始,我接触了叉叉助手(平台曾经被请喝茶了),通过图色辨认,用来给常玩的游戏写挂机脚本,写了也有两三年.也算是我转行当游戏测试的理由.去年11月,也是用了这身技术,混进了外包,薪资还不错,属于是混日子了,岗位是在发行,接触到很多游戏,因为接不了poco,到手只有apk,与日俱增,游戏越来越多,项目组却还是只有这点人.为了加重本人的压力,就开始了UI自动化的不归路. 2)游戏UI自动化因为游戏引擎,是无奈通过appium等框架去获取,如果不接入一些SDK,那么辨认的办法只有图像识别.当初常见的开源框架 网易的Airtest,通过传统辨认进行自动化,还有airtestIDE能够简略疾速的编写airtest代码腾讯GameAISDK,通过深度学习进行自动化(没用过,良久不保护了)阿里的SoloPi,次要性能是录制、群控,有图像匹配辅助图像相干的常见办法: 传统的识别方法: 特色点、模板、轮廓 特色点: SIFT, ORB 下文会具体讲模板匹配: opencv的matchTemplate 最简略的计划,通过讲模板在指标图像中平移,找到最合乎的指标轮廓: HALCON Shape-based Matching, Canny 没用过,写不来,halcon的要花钱基于深度学习的办法: 文字辨认: PaddleOCR,tesseract paddleOCR基本上开箱即用,然而对于游戏内的艺术字,还须要额定的训练图像分类: paddleClas 没有理论用过,感觉能够用在辨别场景,而后去做更加具体的辨认.比方辨认弹窗指标检测: yolo 之前很火的Fps外挂,根本就是靠这个去辨认人体UI自动化的外围在于查找元素,并且在什么地位.那么重点就会放在图像识别上.基于深度学习的计划,须要大量的正负样本和标注工作,因而只能放弃.取而代之的是传统的辨认计划.在社区里、qq的测试群里就能发现,大多数人对传统图像识别的印象是:慢,不准.今年过年前,去张江面试过一家游戏公司,也是发行公司,聊了一个多小时,聊下来他们的计划是airtest一种机型截一个图去做适配.我大受震撼.总结下来图像识别的UI自动化难点: 辨认慢辨认后果不精确多分辨率不兼容性游戏UI更新,治理图片库的老本3)怎么解决那么我做了什么,我的项目就在这里:https://github.com/hakaboom/p...目前也是在重构,重构实现后可能起个好名字:https://github.com/hakaboom/i... 一开始是参考了airtest的aircv局部,过后不想有那么多依赖,就拆出来了.重构之后,通过对opencv一些api的封装,从新组织了构架和算法.目前成果感觉不错,也曾经给airtest提了pr,后续也会推动合并. 装置opencv-python倡议版本能够是4.5.5 pypi上有编译好的,然而只能用cpu办法: pip install opencv-pythonpip install opencv-contrib-python从源码编译,能够自定义更多的货色,比方减少cuda反对 先从opencv仓库克隆代码剩下的看这里 https://github.com/hakaboom/p...什么是特色点简略的了解: 用于形容图像特色的关键点 常见的特色点提取算法: SIFT: 尺度不变特色变换. opencv只有cpu实现SURF: surf的减速算法. opencv有cpu和cuda实现ORB: 应用FAST特色检测和BRIEF特征描述子. opencv有cpu和cuda实现他们的益处是什么: 尺度和旋转不变性,说白了就是兼容不同分辨率、旋转、尺度的变换速度排序: ORB(cuda)>SURF(cuda)>ORB>SURF>SIFT成果排序(成果不止是特色点的数量,更重要的是特色点的品质): SIFT>ORB>SURF 例子6.png(2532x1170)iphone12pro上的截图4.png(1922x1118 理论游戏渲染是1920x1080,多进去的是windows边框)崩三桌面端的截图, 裁剪了右上角的蓝色加号区域当模板import cv2import timefrom baseImage import Image, Rectfrom image_registration.matching import SIFTmatch = SIFT()im_source = Image('tests/image/6.png')im_search = Image('tests/image/4.png').crop(Rect(1498,68,50,56))start = time.time()result = match.find_all_results(im_source, im_search)print(time.time() - start)print(result)img = im_source.clone()for _ in result: img.rectangle(rect=_['rect'], color=(0, 0, 255), thickness=3)img.imshow('ret')cv2.waitKey(0)后果能够失去三个加号的地位 ...

April 25, 2022 · 2 min · jiezi

关于opencv:恒源云云GPU服务器如何使用OpenCV

文章起源 | 恒源云社区(专一人工智能/深度学习云 GPU 服务器训练平台,官网体验网址:恒源智享云) 原文地址 | OpenCV 小编明天体检去了,被抽了4管血,所以目前身娇体弱,不易适度操劳 所以,明天就简略分享个镜像内容吧——OpenCV OpenCVOpenCV 是一个计算机视觉库。用于开发实时的图像处理、计算机视觉以及模式识别程序。 官网镜像中曾经提供了独立的 OpenCV 镜像,该镜像环境下提供反对 GPU 的 C++、Python 的 OpenCV。其余框架镜像中蕴含的 OpenCV 是通过 PIP 装置。 环境阐明OpenCV 框架镜像的代码与装置门路: OpenCV 源码:/usr/src/opencv-4.5.4OpenCV 模块源码:/usr/src/opencv_contrib-4.5.4Build 门路:/usr/src/buildInstall 门路:/usr/local/opencv动态链接库门路已配置在 /etc/ld.so.conf.d/opencv.conf 文件中,pkg-config opencv --cflags --libs 可间接作为编译参数应用。 Python3 也应用通过源码编译出的 OpenCV。pip list 无奈查看到 OpenCV 的包,间接导入即可。 python3 -c "import cv2; print(cv2.__version__)"最初,祝还在日以继夜炼丹的你们,周三欢快呀~

December 22, 2021 · 1 min · jiezi

关于opencv:ApacheCN-计算机视觉译文集-20211110-更新

OpenCV3 和 Qt5 计算机视觉 零、前言一、OpenCV 和 Qt 简介二、创立咱们的第一个 Qt 和 OpenCV 我的项目三、创立一个全面的 Qt + OpenCV 我的项目四、Mat和QImage五、图形视图框架六、OpenCV 中的图像处理七、特色和描述符八、多线程九、视频剖析十、调试与测试十一、链接与部署十二、Qt Quick 利用精通 Python OpenCV4 零、前言第 1 局部:OpenCV 4 和 Python 简介 一、设置 OpenCV二、OpenCV 中的图像根底三、解决文件和图像四、在 OpenCV 中结构根本形态第 2 局部:OpenCV 中的图像处理 五、图像处理技术六、结构和建设直方图七、宰割技术八、轮廓检测,过滤和绘图九、加强事实第 3 局部:OpenCV 中的机器学习和深度学习 十、应用 OpenCV 的机器学习十一、人脸检测,跟踪和辨认十二、深度学习简介第 4 局部:挪动和 Web 计算机视觉 十三、应用 Python 和 OpenCV 的挪动和 Web 计算机视觉十四、答案Python OpenCV3 计算机视觉秘籍 零、前言一、I/O 和 GUI二、矩阵,色彩和过滤器三、轮廓和宰割四、指标检测与机器学习五、深度学习六、线性代数七、检测器和描述符八、图像和视频解决九、多视图几何Python OpenCV 3.x 示例 零、前言一、将几何变换利用于图像二、检测边缘并利用图像过滤器三、卡通化图像四、检测和跟踪不同的身材部位五、从图像中提取特色六、接缝雕刻七、检测形态和宰割图像八、对象跟踪九、对象辨认十、加强事实十一、通过人工神经网络的机器学习Qt5 和 OpenCV4 计算机视觉我的项目 零、前言一、构建图像查看器二、像专业人士一样编辑图像三、家庭平安利用四、人脸上的乐趣五、光学字符识别六、实时对象检测七、实时汽车检测和间隔测量八、OpenGL 图像高速过滤九、答案OpenCV 图像处理学习手册 ...

November 13, 2021 · 2 min · jiezi

关于opencv:经验分享windows-源码编译-opencv

 欢送关注我的公众号 [极智视界],回复001获取Google编程标准 O_o >_<  o_O O_o ~_~ o_O 本教程具体记录了在 windows 上源码编译 opencv 的办法。 后面曾经写过《【教训分享】ubuntu源码编译opencv》、《【教训分享】x86、aarch64、arm32环境编译/穿插编译opencv办法》,对于须要在 ubuntu x86、aarch64、arm32 机子上编译 opencv 的同学能够查阅,文本再拓展一下 windows 上源码编译 opencv 的办法。其实 opencv 官网提供了 windows 上编译好的库,所以对于用户来说,间接拿来用即可,这里咱们折腾一下,本人来编一编,我这里是基于 vs2017 应用 nmake 来编的。 1、下载源码包 opencv 官网下载链接:https://opencv.org/releases/   下载指定版本的源码包 source 即可。 这里以opencv4.3.0为例。 2、编译 opencv   留神要用 vs2017 自带的终端 - 实用于 VS2017 的 X64 本机工具命令提醒。 # 进入编译步骤cd <opencv-source-dir>mkdir buildcd buildcall "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvarsall.bat" amd64cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DWITH_TBB=ON -DWITH_V4L=ON -DBUILD_TIFF=ON ..nmakenmake install 编译装置胜利后,查看 <opencv-source-dir>/build/install/x64/vc15 下生成动静库和动态库,阐明编译胜利: ...

November 4, 2021 · 1 min · jiezi

关于opencv:OpenCV-查找轮廓

本文将联合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。 代码: contours.pyOpenCV 提供了 findContours 函数查找轮廓,须要以二值化图像作为输出、并指定些选项调用即可。 咱们以下图作为示例: 二值化图像代码工程 data/ 提供了小狗和红球的二值化掩膜图像: 其应用预训练好的实例宰割模型来生成的,脚本可见 detectron2_seg_threshold.py。模型检出后果,如下: 模型用的 Mask R-CNN 已有预测边框。但其余模型会有只出预测掩膜的,此时想要边框就能够应用 OpenCV 来提取。 本文代码也提供了依据色域来获取红球掩膜的方法: import cv2 as cvimport numpy as np# 读取图像img = cv.imread(args.image, cv.IMREAD_COLOR)# HSV 阈值,获取掩膜def _threshold_hsv(image, lower, upper): hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) mask = cv.inRange(hsv, lower, upper) result = cv.bitwise_and(image, image, mask=mask) return result, mask_, thres = _threshold_hsv(img, np.array([0,110,190]), np.array([7,255,255]))# 革除小点(可选)kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3), (1, 1))thres = cv.morphologyEx(thres, cv.MORPH_OPEN, kernel)查找轮廓# 查找轮廓# cv.RETR_EXTERNAL: 只查找内部轮廓contours, hierarchy = cv.findContours( threshold, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)# 近似轮廓,减点(可选)contours_poly = [cv.approxPolyDP(c, 3, True) for c in contours]# 绘制轮廓h, w = threshold.shape[:2]drawing = np.zeros((h, w, 3), dtype=np.uint8)for i in range(len(contours)): cv.drawContours(drawing, contours_poly, i, (0, 255, 0), 1, cv.LINE_8, hierarchy)获取边界框boundingRect 获取边界框,并绘制: ...

June 7, 2021 · 1 min · jiezi

关于opencv:OpenCV-霍夫线检测练习直线绘制代码调整

概述黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程中,3.6霍夫线检测代码,对于直线绘制的局部,没有看懂,这里,依据本人的了解,对直线绘制的代码进行了实现。 原理与实现对于笛卡尔坐标系下y = ax + b,转换成极坐标系下有rho = x * cos(theta) + y * sin(theta),两边除以sin(theta)失去下式:y = - cos(theta) / sin(theta) * x + rho / sin(theta)当sin(theta) ==0时,有x = rho / cos(theta)当sin(theta) !=0时,有a = - cos(theta) / sin(theta) ; b = rho / sin(theta)由a, b能够失去直角坐标系下直线方程,能够失去两个点,即可画出直线。在图像上绘制直线的代码如下所示,最初的成果,与老师视频中的成果统一。代码如下所示 print('lines.shape =', lines.shape)h, w = img.shape[:2]for line in lines: rho, theta = line[0] if math.sin(theta) == 0: x = int(rho / math.cos(theta)) cv.line(img, (x, 0), (x, h - 1), (0, 255, 0)) else: a = - math.cos(theta) / math.sin(theta) b = rho / math.sin(theta) # y = a * x + b,计算直线中两个点 x1 = 0 y1 = int(b) x2 = w - 1 y2 = int(a * x1 + b) cv.line(img, (x1, y1), (x2, y2), (0, 255, 0))参考文献https://zhuanlan.zhihu.com/p/... (hough变换原理以及实现(转载) - 知乎) ...

May 3, 2021 · 1 min · jiezi

关于opencv:OpenCVVisual-Studio2019编译环境配置

装置了OpenCV,若想在VS中应用,须要几步操作。 第一步在VS中新建一个空我的项目新建后关上左上角视图,点击其余窗口,抉择属性管理器,就会在窗口右端呈现: 第二步抉择Debug|x64,右键,点击增加新我的项目属性表,能够将表重命名不便识别,点击增加。而后右键新建的表,点击属性,抉择VC++目录,编辑蕴含目录和库目录,增加新行如下图,具体门路参考本人的装置门路。再关上链接器,点击输出,附加依赖项增加:3413是OpenCV的版本号,依据理论更改。再同样地在Release|x64处新建一张一样的表,能够将这两将表保存起来,每次新建OpenCV我的项目只须要将两张表增加到对应地位就能够加重工作量了。 第三步再次点击左上角视图,关上解决方案资源管理器。在源文件处新建cpp项,就能够开始应用OpenCV的库来code了。

March 6, 2021 · 1 min · jiezi

关于opencv:ApacheCN-计算机视觉译文集-20210218-更新

新增了六个教程: OpenCV3 安卓利用编程 零、前言一、设置 OpenCV二、应用相机帧三、利用图像成果四、辨认和跟踪图像五、将图像跟踪与 3D 渲染相结合六、通过 JNI 混合 Java 和 C++OpenCV 即时入门 一、OpenCV 即时入门Python 机器人学习手册 零、前言一、机器人操作系统入门二、理解差动机器人的根底三、建模差动机器人四、应用 ROS 模仿差动机器人五、设计 ChefBot 硬件和电路六、将执行器和传感器连贯到机器人控制器七、视觉传感器与 ROS 接口八、构建 ChefBot 硬件和软件集成九、应用 Qt 和 Python 为机器人设计 GUI十、评估OpenCV2 计算机视觉利用编程秘籍 零、前言一、玩转图像二、操纵像素三、应用类解决图像四、应用直方图计算像素五、通过形态学运算转换图像六、过滤图像七、提取直线,轮廓和整机八、检测和匹配趣味点九、预计图像中的投影关系十、解决视频序列Python OpenCV 计算机视觉 零、前言一、设置 OpenCV二、解决文件,相机和 GUI三、过滤图像四、应用 Haar 级联跟踪人脸五、检测前景/背景区域和深度附录 A:与 Pygame 集成附录 B:为自定义指标生成 Haar 级联Python OpenCV 蓝图 零、前言一、过滤器的乐趣二、应用 Kinect 深度传感器的手势辨认三、通过特色匹配和透视变换查找对象四、应用静止构造重建 3D 场景五、跟踪视觉上显着的对象六、学习辨认交通标志七、学习辨认面部表情下载Dockerdocker pull apachecn0/apachecn-cv-zhdocker run -tid -p <port>:80 apachecn0/apachecn-cv-zh# 拜访 http://localhost:{port} PYPIpip install apachecn-cv-zhapachecn-cv-zh <port># 拜访 http://localhost:{port} NPMnpm install -g apachecn-cv-zhapachecn-cv-zh <port># 拜访 http://localhost:{port} 奉献指南本我的项目须要校对,欢送大家提交 Pull Request。 ...

February 19, 2021 · 1 min · jiezi

关于opencv:ApacheCN-计算机视觉译文集-20210212-更新

新增了六个教程: OpenCV 图像处理学习手册 零、前言一、解决图像和视频文件二、建设图像处理工具三、校对和加强图像四、解决色调五、视频图像处理六、计算摄影七、减速图像处理Python3 OpenCV4 计算机视觉学习手册 零、前言一、设置 OpenCV二、解决文件,相机和 GUI三、应用 OpenCV 解决图像四、深度预计和宰割三、检测和辨认人脸六、检索图像并将图像描述符用于搜寻七、建设自定义对象检测器八、追踪对象九、相机模型和加强事实十、应用 OpenCV 的神经网络简介十一、附录 A:应用“曲线”过滤器蜿蜒色彩空间应用计算机视觉实战我的项目精通 OpenCV 零、前言一、Android 的卡通化器和换肤器二、iPhone 或 iPad 上基于标记的加强事实三、无标记加强事实四、应用 OpenCV 摸索静止构造五、应用 SVM 和神经网络辨认车牌六、非刚性人脸跟踪七、应用 AAM 和 POSIT 的 3D 头部姿态预计八、应用 EigenFace 或 Fisherfaces 的人脸识别OpenCV 安卓编程示例 零、前言一、准备就绪二、利用 1-建设本人的暗室三、利用 2-软件扫描程序四、利用 2-利用透视校对五、利用 3-全景查看器六、利用 4 –主动自拍Python OpenCV 计算机视觉我的项目 零、前言第 1 局部:模块 1 一、设置 OpenCV二、解决文件,相机和 GUI三、过滤图像四、应用 Haar 级联跟踪人脸五、检测前景/背景区域和深度第 2 局部:模块 2 六、检测边缘并利用图像过滤器七、对图像进行卡通化八、检测和跟踪不同的身材部位九、从图像中提取特色十、创立全景图像十一、接缝雕刻十二、检测形态和宰割图像十三、对象跟踪十四、对象辨认十五、平面视觉和 3D 重建第 3 局部:模块 3 十六、加强事实十七、过滤器的乐趣十八、应用 Kinect 深度传感器的手势辨认十九、通过特色匹配和透视变换来查找对象二十、应用静止构造重建 3D 场景二十一、跟踪视觉上显着的对象二十二、学习辨认交通标志二十三、学习辨认面部表情附录 A:集成 Pygame附录 B:为自定义指标生成 Haar 级联附录 C:参考书目树莓派计算机视觉编程 ...

February 12, 2021 · 1 min · jiezi

关于opencv:OpenCV简介及其工程应用游戏色块检测

本文首发于:行者AIOpenCV是一个基于BSD许可(开源)发行的跨平台的计算机视觉和机器学习软件库,能够运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和大量 C++ 类形成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV在图像宰割、人脸识别、物体辨认、动作跟踪、动作剖析、机器视觉等畛域都有宽泛的利用。 以下是OpenCV的基本操作及其利用案例。 1. OpenCV基本操作1.1 读取、显示以及保留操作import cv2image = cv2.imread("test.jpg") # 读取操作cv2.imshow("test", image) # 显示操作cv2.waitKey() # 期待按键cv2.imwrite("save.jpg") # 保留操作1.2 扭转色调空间image = cv2.imread("test.jpg")hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 转换到HSV空间hls = cv2.cvtColor(image, cv2.COLOR_BGR2HLS) # 转换到HLS空间lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab) # 转换到Lab空间gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换到GRAY空间(灰度图) HSV这个模型中色彩的参数别离是:色调(H),饱和度(S),明度(V),该模型罕用来做绿幕宰割。 在图像检测中,能够对样本进行色调空间转换实现数据加强,如将训练数据间接转换到HSV空间,或者调整V(明度)通道的大小,扭转图片的明暗,再转到BGR格局。 1.3 几何变换--缩放、平移、旋转a. 缩放image = cv2.imread("test.jpg")resize = cv2.resize(image, (), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA) # 长宽放大到0.5倍b. 平移在对图像作平移操作时,需创立2行3列变换矩阵,M矩阵示意程度方向上平移为x,竖直方向上的平移间隔为y。 import cv2import numpy as npimage = cv2.imread("test.jpg")rows, cols, channels = image.shapeM = np.float32([[1,0,100],[0,1,50]])res = cv.warpAffine(image, M, (cols, rows))c. 旋转旋转所需的变换矩阵能够通过函数cv2.getRotationMatrix2D失去。 ...

February 6, 2021 · 2 min · jiezi

关于opencv:ApacheCN-计算机视觉译文集-20210203-更新

新增了五个教程: OpenCV3 和 Qt5 计算机视觉 零、前言一、OpenCV 和 Qt 简介二、创立咱们的第一个 Qt 和 OpenCV 我的项目三、创立一个全面的 Qt + OpenCV 我的项目四、Mat和QImage五、图形视图框架六、OpenCV 中的图像处理七、特色和描述符八、多线程九、视频剖析十、调试与测试十一、链接与部署十二、Qt Quick 利用精通 Python OpenCV4 零、前言第 1 局部:OpenCV 4 和 Python 简介 一、设置 OpenCV二、OpenCV 中的图像根底三、解决文件和图像四、在 OpenCV 中结构根本形态第 2 局部:OpenCV 中的图像处理 五、图像处理技术六、结构和建设直方图七、宰割技术八、轮廓检测,过滤和绘图九、加强事实第 3 局部:OpenCV 中的机器学习和深度学习 十、应用 OpenCV 的机器学习十一、人脸检测,跟踪和辨认十二、深度学习简介第 4 局部:挪动和 Web 计算机视觉 十三、应用 Python 和 OpenCV 的挪动和 Web 计算机视觉十四、答案Python OpenCV3 计算机视觉秘籍 零、前言一、I/O 和 GUI二、矩阵,色彩和过滤器三、轮廓和宰割四、指标检测与机器学习五、深度学习六、线性代数七、检测器和描述符八、图像和视频解决九、多视图几何Python OpenCV 3.x 示例 零、前言一、将几何变换利用于图像二、检测边缘并利用图像过滤器三、卡通化图像四、检测和跟踪不同的身材部位五、从图像中提取特色六、接缝雕刻七、检测形态和宰割图像八、对象跟踪九、对象辨认十、加强事实十一、通过人工神经网络的机器学习Qt5 和 OpenCV4 计算机视觉我的项目 零、前言一、构建图像查看器二、像专业人士一样编辑图像三、家庭平安利用四、人脸上的乐趣五、光学字符识别六、实时对象检测七、实时汽车检测和间隔测量八、OpenGL 图像高速过滤九、答案下载Dockerdocker pull apachecn0/apachecn-cv-zhdocker run -tid -p <port>:80 apachecn0/apachecn-cv-zh# 拜访 http://localhost:{port} PYPIpip install apachecn-cv-zhapachecn-cv-zh <port># 拜访 http://localhost:{port} NPMnpm install -g apachecn-cv-zhapachecn-cv-zh <port># 拜访 http://localhost:{port} 奉献指南本我的项目须要校对,欢送大家提交 Pull Request。 ...

February 3, 2021 · 1 min · jiezi

关于opencv:OpenCV-新版-451-发布

作者 | CV君报道 | 我爱计算机视觉(微信id:aicvml)公布亮点: OpenCV Github 我的项目终于冲破50000 stars!新的里程碑~ 这次公布的个性包含: 集成更多的GSoC 2020 我的项目的后果,包含: 1\. 开发了OpenCV.js DNN 模块,以不便再网页中应用,并提供了相干教程。 图像分类 指标检测 格调迁徙 语义宰割 姿势预计 2\. OpenCV.js WASM SIMD 优化 2.0,网页端调用OpenCV更快了 3\. 新增文本检测和辨认高级API 4\. SIFT算法优化,次要是16位整型高斯滤波指令减速 DNN模块的改良: 1\. 改良层/激活函数反对更多模型:1D卷积,1D池化 2\. 修复Resize, ReduceMean,多输入收集,导入Faster RCNN ONNX模型 3\. 反对INT32 ONNX张量 4\. 英特尔®推理引擎后端(OpenVINO™): 减少了对OpenVINO 2021.2版本的反对增加了对HDDL的预览反对 5\. 改良了DNN CUDA后端反对 G-API模块改良: 新增了对G-API框架和操作的改良,改良了OpenVINO™后端反对,新增了Microsoft®ONNX Runtime后端反对,改良了对Python的绑定 RISC-V port重大改良: 极大欠缺了universal intrinsics 的RISC-V后端 其余社区奉献更新: 1\. objdetect 模块新增蜿蜒QR码的检测与解码 ...

December 24, 2020 · 1 min · jiezi

关于opencv:OpenCV开发笔记七十一红胖子8分钟带你深入级联分类器训练

若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109096211各位读者,常识无穷而人力有穷,要么改需要,要么找专业人士,要么本人钻研红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中...(点击传送门) OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(七十):红瘦子带你傻瓜式编译VS2017x64版本的openCV4》下一篇:继续补充中… 前言 红瘦子,来也! 做图像处理,常常头痛的是明明分离出来了(非色彩的),分为几块区域,那怎么晓得这几块区域到底哪一块是咱们须要的,那么这部分就波及到须要辨认了。 辨认能够本人写模板匹配、特色点辨认、级联分类器训练辨认。 本文章就是解说级联分类器的训练与辨认。 级联分类器相干 OpenCV的级联分类器分有两个,别离为Harr级联分类器和LBP级联分类器。具体级联分类器请查看: 《OpenCV开发笔记(五十四):红瘦子8分钟带你深刻理解Haar级联分类器进行人脸检测(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(五十五):红瘦子8分钟带你深刻理解Haar、LBP特色以及级联分类器辨认过程(图文并茂+浅显易懂+程序源码)》 明确指标 指标是辨认视频中的歌手,咱们先手动采集数据汇合。 视频为《绿色》,如下图: 训练分类器前的筹备工作采集正样本图片 正样本的尺寸不是必须统一的,然而要和生成的正样本矢量文件中的宽高有雷同的比例(因为训练过程中,会依据设置的宽高进行等比缩放,比方设置正版本图片是128x128的,那么样本为256x256会缩放,假如杨文为256x128的那么比例就不同了,这个图怎么解决?待定); 正样本图片应该尽可能蕴含少的烦扰背景信息。在训练过程中多余的背景信息也会成为正样本的一个部分特色,此处与深度学习不同,深度学习当初支流无脑深度学习,图像根本的一些去噪都可能不做。 数据起源尽可能做到多样化,比方样本为车,车的姿势场景应稍丰盛些。同一正样本指标的图像太多会使部分特色过于显著,造成这个指标的训练过拟合,影响检测精度,不利于训练器泛化应用。 咱们采集视频的人脸,先把视频解码后保留成jpg图片。 此处省略一万字...................................... 创立样本:opencv_createsamples.exe 应用opencv自带的命令行工具opencv_createsamples.exe [-info <collection_file_name>]样本阐明文件,每一行的内容为 xxx.jpg nums x y width height 例如:图片中有两个指标 xxx.jpg 2 0 0 100 100 200 200 100 100 生成样本在windows上依靠命令行 dir /b > pos.data[-img <image_file_name>] 通过一张图片的扭曲形变成多张图片作为样本,就填写这个参数,参数的内容为要扭曲的图片的门路。填入后,-info参数不再无效。 [-vec <vec_file_name>] 样本形容文件的名字及门路 [-bg <background_file_name>] 负样本形容文件的名字及门路,如果省略,则应用bgcolor的值填充作为背景。就是跟寄存负样本图片(背景图片)目录地位雷同的形容文件的门路,可用txt,dat等格局保留,每一行的内容为:xxx.jpg。 [-inv] 如果指定该标记,前景图像的色彩将翻转 [-randinv] 如果指定该标记,色彩将随机地翻转 [-num <number_of_samples = 1000>] 总共几个样本,能够省略,则依照输出的理论样本数量产生 ...

October 19, 2020 · 2 min · jiezi

关于opencv:OpenCV开发笔记七十红胖子带你傻瓜式编译VS2017x64版本的openCV4

若该文为原创文章,未经容许不得转载,经容许后转载请注明原文地址本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107837715各位读者,常识无穷而人力有穷,要么改需要,要么找专业人士,要么本人钻研红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中...(点击传送门) OpenCV开发专栏(点击传送门)上一篇:OpenCV开发笔记(六十九):红瘦子8分钟带你应用传统办法辨认已知物体(图文并茂+浅显易懂+程序源码)下一篇:继续补充中… 前言 红瘦子来也!!! opencv_contrib是opencv提供额定的工具,提供一些根底算法,之前编译了不带opencv_contrib的版本,不带opencv_contrib的cuda硬减速版本, opencv+opentrib的版本。 OpenCV4是最新的版本,编译一个openCV4的msvc版本。 版本汇总- Qt5.2.0 mingw32 + Opencv2.4.10 版本《OpenCV开发笔记(〇):应用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境》 - Qt5.9.3 mingw32 + Opencv3.4.1 版本《OpenCV开发笔记(一):OpenCV介绍、编译》 - Opencv3.4.0 + cuda9.0 + VS2015版本《OpenCV开发笔记(十二):OpenCV编译反对Gpu(cuda) 减速开发之win-qt-msvc2015编译(opencv3.4.0、cuda9.0、VS2015)》 以上打包汇合下载地址:https://download.csdn.net/download/qq21497936/12255080 OpenCV4下载 应用版本4.4.0 官网下载地址:https://opencv.org CSDN下载地址:https://download.csdn.net/download/qq21497936/12917447 QQ群:1047134658(点击“文件”搜寻“opencv”,群内与博文同步更新) OpenCV编译步骤一:解压到编译文件夹 步骤二:CMake配置configure第一次 配置时,间接选中msvc 2017即可(带x64是64位,不带是32位) 步骤三:勾选局部配置,全局+opencv 其余不勾选了。 步骤四:Generate生成工程 步骤五:关上编译 进入VS2017,而后指标是win64,间接编译win64的release版本。 步骤六:编译胜利 模块化 在这里附上Qt工程文件要带的库文件引入配置 # 不带opencv_contrib的world版本 opencv4.4.0LIBS += -L$$PWD/openCV4.4.0/lib -lopencv_world440INCLUDEPATH += $${PWD}/openCV4.4.0/include \ $${PWD}/openCV4.4.0/include/opencv \ $${PWD}/openCV4.4.0/include/opencv2 测试Demovoid OpenCVManager::testRunNormal(){ cv::namedWindow("testRunNormal"); cv::waitKey(0);} ...

October 15, 2020 · 1 min · jiezi

关于opencv:Opencv-python之车辆识别项目

图片车辆辨认依据文章搭建好环境后开始进行做我的项目link import sysimport cv2from PyQt5.QtGui import *from PyQt5.QtWidgets import *from PyQt5.QtGui import QIcon, QPalette, QPixmap, QBrush, QRegExpValidatorclass mainWin(QWidget): def __init__(self): """ 构造函数 """ super().__init__() self.initUI() self.openBtn.clicked.connect(self.openFile) # 信号和槽 self.grayBtn.clicked.connect(self.imgGray) # 信号和槽 self.carCheckBtn.clicked.connect(self.carCheck) def initUI(self): # 设置窗口得大小 self.setFixedSize(860, 600) # 图标和背景 self.setWindowTitle("车辆检测") self.setWindowIcon(QIcon("img/icon.jpg")) # 图标 # 标签 self.leftLab = QLabel("原图:", self) self.leftLab.setGeometry(10, 50, 400, 400) # 设置相对地位 self.leftLab.setStyleSheet("background:white") self.newLab = QLabel("新图:", self) self.newLab.setGeometry(420, 50, 400, 400) # 设置相对地位 self.newLab.setStyleSheet("background-color:white") # 按钮 self.openBtn = QPushButton(" 关上文件", self) self.openBtn.setGeometry(10, 10, 80, 30) self.grayBtn = QPushButton(" 灰度解决", self) self.grayBtn.setGeometry(100, 10, 80, 30) self.carCheckBtn = QPushButton(" 视频检测", self) self.carCheckBtn.setGeometry(200, 10, 80, 30)关上文件办法 ...

September 2, 2020 · 2 min · jiezi

关于opencv:OpenCV开发笔记六十九红胖子8分钟带你使用传统方法识别已知物体图文并茂浅显易懂程序源码

若该文为原创文章,未经容许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107837715各位读者,常识无穷而人力有穷,要么改需要,要么找专业人士,要么本人钻研红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中...(点击传送门) OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(六十八):红瘦子8分钟带你应用特色点Flann最邻近差值匹配辨认(图文并茂+浅显易懂+程序源码)》下一篇:继续补充中… 前言 红瘦子,来也! 特色点、匹配,那么如何应用特色点和匹配来辨认已有的物体,也就剩最要害的最初一步:寻找已知的物体了。 Demo 寻找已知物体本篇章应用sift/surf特色点sift特色点 尺度不变特色变换(Scale-invariant feature transform,SIFT),是用于图像处理畛域的一种形容。这种形容具备尺度不变性,可在图像中检测出关键点,是一种部分特征描述子。 surf特色点 SURF算法采纳了很多办法来对每一步进行优化从而进步速度。剖析显示在后果成果相当的状况下SURF的速度是SIFT的3倍。SURF长于解决具备含糊和旋转的图像,然而不长于解决视角变动和光照变动。(SIFT特色是部分特色,其对旋转、尺度缩放、亮度变动放弃不变性,对视角变动、仿射变换、噪声也放弃肯定水平的稳定性)。 针对图像场景的特点,抉择不同的特色点,列出之前特色点相干的博文: 《OpenCV开发笔记(六十三):红瘦子8分钟带你深刻理解SIFT特色点(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(六十四):红瘦子8分钟带你深刻理解SURF特色点(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(六十五):红瘦子8分钟带你深刻理解ORB特色点(图文并茂+浅显易懂+程序源码)》 本篇章使用暴力、最邻近差值匹配暴力匹配 最佳特色匹配总是尝试所有可能的匹配,从而使得它总可能找到最佳匹配,这也是BruteForce(暴力法)的原始含意,波及到的类为BFMatcher类。 《OpenCV开发笔记(六十七):红瘦子8分钟带你深刻理解特色点暴力匹配(图文并茂+浅显易懂+程序源码)》 最近邻差值匹配 一种近似法,算法更快然而找到的是最近邻近似匹配,所以当咱们须要找到一个绝对好的匹配然而不须要最佳匹配的时候往往应用FlannBasedMatcher。 《OpenCV开发笔记(六十八):红瘦子8分钟带你应用特色点Flann最邻近差值匹配辨认(图文并茂+浅显易懂+程序源码)》 概述 对已知物体:过滤、去噪后、提取已知物体的特色点; 对场景:过滤、去噪后、提取场景的特色点; 对已知物体特色点汇合和场景中的特色点汇合去匹配,计算投影矩阵; 若胜利计算变换矩阵就示意辨认到物体; 通过原始的四个点地位进行变换矩阵计算,即可失去场景中的已知物体的四个顶点,该四个顶点连接起来就是已知物体的地位。 特色点汇合计算变换矩阵函数原型Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method = 0, double ransacReprojThreshold = 3, OutputArray mask=noArray(), const int maxIters = 2000, const double confidence = 0.995);参数一:InputArray类型的srcPoints,源立体上的对应点,能够是CV_32FC2的矩阵类型或者vector<Point2>;参数二:InputArray类型的dstPoints;指标立体上的对应点 , 可 以 是CV 32FC2 的矩阵类型或者 vector<Point2>; 参数三:int类型的method,用于计算单应矩阵的办法,如下图: 参数四:double类型的ransacReprojThreshold,最大容许重投影谬误将点对视为内联线(仅用于RANSAC和RHO办法);参数五:OutputArray类型的mask,由鲁棒办法(RANSAC或LMEDS)设置的可选输入掩码。留神输出掩码值被疏忽。;参数六:const int类型的maxIters,RANSAC迭代的最大数量。;参数七:const double类型的confidence,置信水平,介于0和1之间;矩阵变换函数原型void perspectiveTransform( InputArray src, InputArray dst, InputArray m);参数一:InputArray类型的src,输出两通道或三通道浮点数组;每个元素是要转换的二维/三维向量。参数二:InputArray类型的dst,与src大小和类型雷同的输入数组;参数三:InputArray类型的h,3x3或4x4浮点转换矩阵。 ...

August 6, 2020 · 6 min · jiezi

关于opencv:OpenCV开发笔记六十八红胖子8分钟带你使用特征点Flann最邻近差值匹配识别图文并茂浅显易懂程序源码

若该文为原创文章,未经容许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107357296各位读者,常识无穷而人力有穷,要么改需要,要么找专业人士,要么本人钻研红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中...(点击传送门) OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(六十七):红瘦子8分钟带你深刻理解特色点暴力匹配(图文并茂+浅显易懂+程序源码)》下一篇:继续补充中… 前言 红瘦子,来也! 后面解说了特色点,那么匹配特色点,就是匹配两者的类似度,类似度达到肯定的阈值,则认为辨认了。 思考性能,除开暴力匹配外,还有最近邻匹配。 Demo 最近邻匹配(FLANN) FlannBasedMatcher中FLANN的含意是Fast Library forApproximate Nearest Neighbors,目前最残缺的(近似)最近邻匹配。岂但实现了一系列查找算法,还蕴含了一种主动选取最快算法的机制。 从字面意思可知它是一种近似法,算法更快然而找到的是最近邻近似匹配,所以当咱们须要找到一个绝对好的匹配然而不须要最佳匹配的时候往往应用FlannBasedMatcher。 当然也能够通过调整FlannBasedMatcher的参数来进步匹配的精度或者进步算法速度,然而相应地算法速度或者算法精度会受到影响。 本篇章应用sift/surf特色点sift特色点 尺度不变特色变换(Scale-invariant feature transform,SIFT),是用于图像处理畛域的一种形容。这种形容具备尺度不变性,可在图像中检测出关键点,是一种部分特征描述子。 surf特色点 SURF算法采纳了很多办法来对每一步进行优化从而进步速度。剖析显示在后果成果相当的状况下SURF的速度是SIFT的3倍。SURF长于解决具备含糊和旋转的图像,然而不长于解决视角变动和光照变动。(SIFT特色是部分特色,其对旋转、尺度缩放、亮度变动放弃不变性,对视角变动、仿射变换、噪声也放弃肯定水平的稳定性)。针对图像场景的特点,抉择不同的特色点,列出之前特色点相干的博文: 《OpenCV开发笔记(六十三):红瘦子8分钟带你深刻理解SIFT特色点(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(六十四):红瘦子8分钟带你深刻理解SURF特色点(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(六十五):红瘦子8分钟带你深刻理解ORB特色点(图文并茂+浅显易懂+程序源码)》 FlannBasedMatcher类的应用定义// 定义匹配器cv::Ptr<cv::FlannBasedMatcher> pFlannBasedMatcher = cv::FlannBasedMatcher::create();// 定义后果寄存std::vector<cv::DMatch> listDMatch;// 存储特色点检测器检测特色后的形容字cv::Mat descriptor1;cv::Mat descriptor2;特色点提取pFlannBasedMatcher->detectAndCompute(srcMat1, cv::Mat(), keyPoints1, descriptor1);pFlannBasedMatcher->detectAndCompute(srcMat1, cv::Mat(), keyPoints1, descriptor1);匹配// FlannBasedMatcher最近邻匹配pFlannBasedMatcher->match(descriptor1, descriptor2, listDMatch); FlannBasedMatcher相干函数原型static Ptr<FlannBasedMatcher> create() ;无参数 FlannBasedMatcher::match( InputArray queryDescriptors, InputArray trainDescriptors, std::vector<DMatch>& matches, InputArray mask=noArray() ) const;参数一:InputArray类型的queryDescriptors,查问描述符集,个别cv::Mat,某个特征提取的描述符。参数二:InputArray类型的trainDescriptors,训练描述符集,此处输出的应该是没有退出到类对象汇合种的(该类有训练的数据汇合),个别cv::Mat,某个特征提取的描述符。参数三:std::vector<DMatch>类型的matches。如果在掩码中屏蔽了查问描述符,则不会为此增加匹配项描述符。因而,匹配项的大小可能小于查问描述符计数。参数四:InputArray类型的mask,指定输出查问和训练矩阵之间容许的匹配的掩码描述符。绘制匹配关系图函数原型 void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1, InputArray img2, const std::vector<KeyPoint>& keypoints2, const std::vector<DMatch>& matches1to2, InputOutputArray outImg, const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1), const std::vector<char>& matchesMask=std::vector<char>(), int flags=DrawMatchesFlags::DEFAULT );参数一:InputArray类型的img1,图像1。参数二:std::vector<KeyPoint>类型的keypoints1,图像1的关键点。参数三:InputArray类型的img2,图像2。参数四:std::vector<KeyPoint>类型的keypoints2,图像2的关键点。参数五:std::vector<DMatch>类型的matchers1to2,从第一个图像匹配到第二个图像,这意味着keypoints1[i]在keypoints2中有一个对应的点[matches[i]]。参数六:InputOutputArray类型的outImg,为空时,默认并排绘制输入图像以及连贯关键点;若不为空,则在图像上绘制关系点。参数七:Scalar类型的matcherColor,匹配色彩匹配(线和连贯的关键点)的色彩。如果色彩为cv::Scalar::all(-1),则为随机色彩。参数八:Scalar类型的singlePointColor,色彩单个关键点(圆)的色彩,这意味着关键点没有匹配到的则认是该色彩。参数九:std::vector<char>类型的matchersMask,确定绘制的匹配我的项目,若是为空,则示意全副绘制。参数十:int类型的flags,查看枚举DrawMatchesFlags,如下: ...

July 23, 2020 · 5 min · jiezi

OpenCV开发笔记六十七红胖子8分钟带你深入了解特征点暴力匹配图文并茂浅显易懂程序源码

若该文为原创文章,未经容许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107348874红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中…(点击传送门) OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(六十六):红瘦子8分钟带你总结形态学操作-收缩、侵蚀、开运算、闭运算、梯度、顶帽、黑帽(图文并茂+浅显易懂+程序源码)》下一篇:继续补充中… 前言 红瘦子,来也! 后面解说了特色点,那么匹配特色点,原始图像与指标图像之间存在哪些匹配的同类型的特色点,匹配点的多少则是作为类似度的输出,达到肯定类似度则认为匹配到了。 本篇章联合sift特色点和暴力匹配,进行特色点匹配实现步骤原理解说。 Demo 第四个图片的匹配成果不好,想要成果好须要依据图像特点去抉择特色点提取的形式,此处次要是为了解说流程。 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107348874 最佳特色匹配(暴力匹配) 最佳特色匹配总是尝试所有可能的匹配,从而使得它总可能找到最佳匹配,这也是BruteForce(暴力法)的原始含意,波及到的类为BFMatcher类。 本篇章应用的是Sift特色点概述 SIFT,即尺度不变特色变换(Scale-invariant feature transform,SIFT),是用于图像处理畛域的一种形容。这种形容具备尺度不变性,可在图像中检测出关键点,是一种部分特征描述子。 SIFT算法特点以及SIFT相干函数的应用SIFT特色是部分特色,其对旋转、尺度缩放、亮度变动放弃不变性,对视角变动、仿射变换、噪声也放弃肯定水平的稳定性;辨别性(Distinctiveness)好,信息量丰盛,实用于在海量特色数据库中进行疾速、精确的匹配;多量性,即便多数的几个物体也能够产生大量的SIFT特征向量;高速性,经优化的SIFT匹配算法甚至能够达到实时的要求;可扩展性,能够很不便的与其余模式的特征向量进行联结; 无关sift、surf、orb和应用请查看博文 针对图像场景的特点,抉择不同的特色点,列出之前特色点相干的博文: 《OpenCV开发笔记(六十三):红瘦子8分钟带你深刻理解SIFT特色点(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(六十四):红瘦子8分钟带你深刻理解SURF特色点(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(六十五):红瘦子8分钟带你深刻理解ORB特色点(图文并茂+浅显易懂+程序源码)》 BFMatcher类的应用定义// 定义匹配器cv::Ptr<cv::BFMatcher> pBFMatcher;// 定义后果寄存std::vector<cv::DMatch> listDMatch;// 存储特色点检测器检测特色后的形容字cv::Mat descriptor1;cv::Mat descriptor2;特色点提取_pSift->detectAndCompute(srcMat1, cv::Mat(), keyPoints1, descriptor1);_pSift->detectAndCompute(srcMat1, cv::Mat(), keyPoints1, descriptor1);匹配// bfMatcher暴力匹配pBFMatcher->match(descriptor1, descriptor2, listDMatch);BFMatcher相干函数原型static Ptr<BFMatcher> create( int normType=NORM_L2, bool crossCheck=false ) ;参数一:int类型的normType,欧式间隔,NORM类型中:NORM_L1,NORM_L2,NORM_HAMMING,NORM_HAMMING 2,L1、L2是SIFT和SURF描述符的最优选抉择;NORM_HAMMING应与ORB、BRISK和BRIEF搭配应用;NORM_HAMMING2应该与ORB一起应用,当WTA_K==3或者4时。 参数二:bool类型的crossCheck,如果是false,这将是BFMatcher在找到k时的默认行为:每个查问描述符的最近街坊。如果crossCheck==true,则应用k=1只返回对(i,j),对于第i个查问描述符,在匹配器的汇合是最近的,反之亦然,即BFMatcher只返回统一的对。当存在异样值时,这种技术通常会产生最佳后果,而离群值数量很少够了。这是D.Lowe在筛纸中应用的比率测试的代替办法。void BFMatcher::match( InputArray queryDescriptors, InputArray trainDescriptors, std::vector<DMatch>& matches, InputArray mask=noArray() ) const;参数一:InputArray类型的queryDescriptors,查问描述符集,个别cv::Mat,某个特征提取的描述符。参数二:InputArray类型的trainDescriptors,训练描述符集,此处输出的应该是没有退出到类对象汇合种的(该类有训练的数据汇合),个别cv::Mat,某个特征提取的描述符。参数三:匹配匹配项。如果在掩码中屏蔽了查问描述符,则不会为此增加匹配项描述符。因而,匹配项的大小可能小于查问描述符计数。参数四:指定输出查问和训练矩阵之间容许的匹配的掩码描述符。绘制匹配关系图函数原型参数一:InputArray类型的img1,图像1。参数二:std::vector<KeyPoint>类型的keypoints1,图像1的关键点。参数三:InputArray类型的img2,图像2。参数四:std::vector<KeyPoint>类型的keypoints2,图像2的关键点。参数五:std::vector<DMatch>类型的matchers1to2,从第一个图像匹配到第二个图像,这意味着keypoints1[i]在keypoints2中有一个对应的点[matches[i]]。参数六:InputOutputArray类型的outImg,为空时,默认并排绘制输入图像以及连贯关键点;若不为空,则在图像上绘制关系点。参数七:Scalar类型的matcherColor,匹配色彩匹配(线和连贯的关键点)的色彩。如果色彩为cv::Scalar::all(-1),则为随机色彩。参数八:Scalar类型的singlePointColor,色彩单个关键点(圆)的色彩,这意味着关键点没有匹配到的则认是该色彩。参数九:std::vector<char>类型的matchersMask,确定绘制的匹配我的项目,若是为空,则示意全副绘制。参数十:int类型的flags,查看枚举DrawMatchesFlags,如下: Demovoid OpenCVManager::testBFMatcher(){ QString fileName1 = "13.jpg"; int width = 400; int height = 300; cv::Mat srcMat = cv::imread(fileName1.toStdString()); cv::resize(srcMat, srcMat, cv::Size(width, height)); cv::String windowName = _windowTitle.toStdString(); cvui::init(windowName); cv::Mat windowMat = cv::Mat(cv::Size(srcMat.cols * 2, srcMat.rows * 3), srcMat.type()); cv::Ptr<cv::xfeatures2d::SIFT> _pSift = cv::xfeatures2d::SiftFeatureDetector::create(); int k1x = 0; int k1y = 0; int k2x = 100; int k2y = 0; int k3x = 100; int k3y = 100; int k4x = 0; int k4y = 100; cv::Ptr<cv::BFMatcher> pBFMatcher; pBFMatcher = cv::BFMatcher::create(); std::vector<cv::DMatch> listDMatch; cv::Mat descriptor1; cv::Mat descriptor2; bool moveFlag = true; // 挪动的标记,不必每次都匹配 windowMat = cv::Scalar(0, 0, 0); while(true) { cv::Mat mat; { std::vector<cv::KeyPoint> keyPoints1; std::vector<cv::KeyPoint> keyPoints2; int k1xOld = k1x; int k1yOld = k1y; int k2xOld = k2x; int k2yOld = k2y; int k3xOld = k3x; int k3yOld = k3y; int k4xOld = k4x; int k4yOld = k4y; mat = windowMat(cv::Range(srcMat.rows * 0, srcMat.rows * 1), cv::Range(srcMat.cols * 0, srcMat.cols * 1)); mat = cv::Scalar(0); cvui::printf(windowMat, 0 + width * 0, 10 + height * 0, "k1x"); cvui::trackbar(windowMat, 0 + width * 0, 20 + height * 0, 165, &k1x, 0, 100); cvui::printf(windowMat, 0 + width * 0, 70 + height * 0, "k1y"); cvui::trackbar(windowMat, 0 + width * 0, 80 + height * 0, 165, &k1y, 0, 100); cvui::printf(windowMat, width / 2 + width * 0, 10 + height * 0, "k2x"); cvui::trackbar(windowMat, width / 2 + width * 0, 20 + height * 0, 165, &k2x, 0, 100); cvui::printf(windowMat, width / 2 + width * 0, 70 + height * 0, "k2y"); cvui::trackbar(windowMat, width / 2 + width * 0, 80 + height * 0, 165, &k2y, 0, 100); cvui::printf(windowMat, 0 + width * 0, 10 + height * 0 + height / 2, "k3x"); cvui::trackbar(windowMat, 0 + width * 0, 20 + height * 0 + height / 2, 165, &k3x, 0, 100); cvui::printf(windowMat, 0 + width * 0, 70 + height * 0 + height / 2, "k3y"); cvui::trackbar(windowMat, 0 + width * 0, 80 + height * 0 + height / 2, 165, &k3y, 0, 100); cvui::printf(windowMat, width / 2 + width * 0, 10 + height * 0 + height / 2, "k4x"); cvui::trackbar(windowMat, width / 2 + width * 0, 20 + height * 0 + height / 2, 165, &k4x, 0, 100); cvui::printf(windowMat, width / 2 + width * 0, 70 + height * 0 + height / 2, "k4y"); cvui::trackbar(windowMat, width / 2 + width * 0, 80 + height * 0 + height / 2, 165, &k4y, 0, 100); if( k1xOld != k1x || k1yOld != k1y || k2xOld != k2x || k2yOld != k2y || k3xOld != k3x || k3yOld != k3y || k4xOld != k4x || k4yOld != k4y) { moveFlag = true; } std::vector<cv::Point2f> srcPoints; std::vector<cv::Point2f> dstPoints; srcPoints.push_back(cv::Point2f(0.0f, 0.0f)); srcPoints.push_back(cv::Point2f(srcMat.cols - 1, 0.0f)); srcPoints.push_back(cv::Point2f(srcMat.cols - 1, srcMat.rows - 1)); srcPoints.push_back(cv::Point2f(0.0f, srcMat.rows - 1)); dstPoints.push_back(cv::Point2f(srcMat.cols * k1x / 100.0f, srcMat.rows * k1y / 100.0f)); dstPoints.push_back(cv::Point2f(srcMat.cols * k2x / 100.0f, srcMat.rows * k2y / 100.0f)); dstPoints.push_back(cv::Point2f(srcMat.cols * k3x / 100.0f, srcMat.rows * k3y / 100.0f)); dstPoints.push_back(cv::Point2f(srcMat.cols * k4x / 100.0f, srcMat.rows * k4y / 100.0f)); cv::Mat M = cv::getPerspectiveTransform(srcPoints, dstPoints); cv::Mat srcMat2; cv::warpPerspective(srcMat, srcMat2, M, cv::Size(srcMat.cols, srcMat.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar::all(0)); mat = windowMat(cv::Range(srcMat.rows * 0, srcMat.rows * 1), cv::Range(srcMat.cols * 1, srcMat.cols * 2)); cv::addWeighted(mat, 0.0f, srcMat2, 1.0f, 0.0f, mat); if(moveFlag) { moveFlag = false; //特色点检测 // _pSift->detect(srcMat, keyPoints1); _pSift->detectAndCompute(srcMat, cv::Mat(), keyPoints1, descriptor1); //绘制特色点(关键点) cv::Mat resultShowMat; cv::drawKeypoints(srcMat, keyPoints1, resultShowMat, cv::Scalar(0, 0, 255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); mat = windowMat(cv::Range(srcMat.rows * 1, srcMat.rows * 2), cv::Range(srcMat.cols * 0, srcMat.cols * 1)); cv::addWeighted(mat, 0.0f, resultShowMat, 1.0f, 0.0f, mat); //特色点检测 // _pSift->detect(srcMat2, keyPoints2); _pSift->detectAndCompute(srcMat2, cv::Mat(), keyPoints2, descriptor2); //绘制特色点(关键点) cv::Mat resultShowMat2; cv::drawKeypoints(srcMat2, keyPoints2, resultShowMat2, cv::Scalar(0, 0, 255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); mat = windowMat(cv::Range(srcMat.rows * 1, srcMat.rows * 2), cv::Range(srcMat.cols * 1, srcMat.cols * 2)); cv::addWeighted(mat, 0.0f, resultShowMat2, 1.0f, 0.0f, mat); // bfMatcher暴力匹配 pBFMatcher->match(descriptor1, descriptor2, listDMatch); // drawMatch绘制进去,并排显示了,高度一样,宽度累加(因为两个宽度雷同,所以是两倍了) cv::Mat matchesMat; cv::drawMatches(srcMat, keyPoints1, srcMat2, keyPoints2, listDMatch, matchesMat); mat = windowMat(cv::Range(srcMat.rows * 2, srcMat.rows * 3), cv::Range(srcMat.cols * 0, srcMat.cols * 2)); cv::addWeighted(mat, 0.0f, matchesMat, 1.0f, 0.0f, mat); } } cv::imshow(windowName, windowMat); // 更新 cvui::update(); // 显示 // esc键退出 if(cv::waitKey(25) == 27) { break; } }} ...

July 14, 2020 · 4 min · jiezi

OpenCV开发笔记六十六红胖子8分钟带你总结形态学操作膨胀腐蚀开运算闭运算梯度顶帽黑帽

若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107106565红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) Qt开发专栏:项目实战(点击传送门)OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)》下一篇:持续补充中… 前言 红胖子,来也! opencv之前讲解了各种形态学操作,使用了形态学对应的函数,除此之外,opencv在形态学上还提供了专门的函数处理,一个函数搞定所有,当然就不能实现自定义的一些算法,如3次膨胀,2次腐蚀了(之前的开、闭运算demo提供了这种操作)。 Demo 形态学 图像处理中的形态学,指数字形态学。 数学形态学是数学形态学图像处理的基本理论,其基本的运算包括:二值腐蚀和膨胀、二值开源算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、合理分析、流域变换、灰值腐蚀和膨胀、灰值开运算、灰值形态学梯度。 形态学操作就是基于形状的一系列图像处理操作,OpenCV为进行图像的形态学变换提供了快捷、方便的函数。除了之前讲解的单个操作的函数外,OpenCV还为我们提供了一个形态学专有函数,通过枚举来进行不同的操作。 膨胀 膨胀(dilate)是求局部最大值的操作,从数据角度来说,膨胀是将图像与核进行卷积,实现了对目标像素点进行扩展的目的。 《OpenCV开发笔记(二十一):算法基础之形态学滤波-膨胀》 腐蚀 腐蚀(delate)与膨胀(ercode)是一对相反的操作,膨胀是求局部最大值的操作,那么膨胀就是求局部最小值的操作。 《OpenCV开发笔记(二十二):算法基础之形态学滤波-腐蚀》 开运算 开运算(Opening Operation)就是先腐蚀后膨胀的过程。、 开运算可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积(去除噪声及平滑目标边界)。 《OpenCV开发笔记(二十三):算法基础之形态学滤波-开运算(先腐蚀后膨胀)》 闭运算 闭运算(Closing Operation)就是先膨胀后腐蚀的过程。、 闭运算可以用拟合小裂缝,消除小型黑洞,并且在平滑较大物体的边界的同时不明显改变其面积。 闭运算能填充目标区域内的离散小空洞和分散部分。 《OpenCV开发笔记(二十四):算法基础之形态学滤波-闭运算(先膨胀后腐蚀)》 形态学梯度 形态学梯度(Morphological Gradient)是膨胀(被减数)和腐蚀(减数)的差别,结果看上去就像前景物体的轮廓。 形态学梯度可以保留物体的边缘轮廓。 《OpenCV开发笔记(二十五):算法基础之形态学滤波-形态学梯度》 顶帽(礼帽) 顶帽运算(Top Hat)又称作“礼帽”运算,是原图像(减数)与“开运算”(被减数)的结果图之差。开运算带来的结果是放大了裂缝或者局部降低亮度的区域。因此,从原图中减去开运算后的图,得到的效果突出了比原图轮廓周围的区域更明亮的区域,且这一操作与选择的核的大小相关。顶帽运算往往用来分离比邻近点亮一些的斑块。在一幅图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。 《OpenCV开发笔记(二十六):算法基础之形态学滤波-顶帽(礼帽)》 黑帽 黑帽(Black Hat)运算是闭运算(被减数)的结果图与原图像(减数)之差。 黑帽运算后的效果突出了比原图轮过周围的区域更暗的区域,且这一操作和选择的核大小相关。 所以与顶帽操作相反,黑帽操作是用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓。 《OpenCV开发笔记(二十七):算法基础之形态学滤波-黑帽》本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107106565 形态学函数原型void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );参数一:InputArray类型,一般是cv::Mat,通道数是任意的,但是深度必须为CV_8U、CV_16U、CV_16S、CV_32F或CV_64F;参数二;OutputArray类型,输出的目标图像,和原图像有一样的尺寸和类型;参数三;int类型的op,表示形态学计算的操作类型,如下图: ...

July 5, 2020 · 3 min · jiezi

项目实战QtOpenCV图像处理与识别算法平台

若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107090002红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) Qt开发专栏:项目实战(点击传送门)OpenCV开发专栏(点击传送门) 需求 做算法过程中,需要一个平台来实时查看效果,记录处理过程,可以一键查看效果; OpenCV的各种算法在Qt效果调试; 持续升级版本,敬请期待... 原理 基于Qt的OpenCV开发,依托Qt作为界面,OpenCV进行图像处理。 涉及技术博文 《OpenCV开发笔记(三十四):红胖子带你傻瓜式编译Qt+openCV3.4.1+opencv_contrib(全网最浅显易懂)》 《OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储》 《OpenCV开发笔记(十三):OpenCV图像对比度、亮度的调整》 《OpenCV开发笔记(十四):算法基础之线性滤波-方框滤波》 《OpenCV开发笔记(十五):算法基础之线性滤波-均值滤波》 《OpenCV开发笔记(十六):算法基础之线性滤波-高斯滤波》 《OpenCV开发笔记(十八):算法基础之非线性滤波-中值滤波》 《OpenCV开发笔记(十九):算法基础之非线性滤波-双边滤波》 《OpenCV开发笔记(二十一):算法基础之形态学滤波-膨胀》 《OpenCV开发笔记(二十二):算法基础之形态学滤波-腐蚀》 Demo:Qt+OpenCV算法平台 v1.4.0下载地址 CSDN:https://download.csdn.net/download/qq21497936/12570673 QQ群:1047134658(点击“文件”搜索“qtOpenCVTools”,群内与博文同步更新) 腐蚀 膨胀 双边滤波 中值滤波 高斯滤波 均值滤波 方框滤波 对比度与亮度 图片打开与保存 核心代码common.h#ifndef COMMON_H#define COMMON_H#include <QImage>#include <QDebug>#include <QFileDialog>#include <QColorDialog>#include <QMessageBox>#include <QHash>// opencv#include "opencv/highgui.h"#include "opencv/cxcore.h"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/opencv.hpp"#include "opencv2/xphoto.hpp"// opencv_contrib#include <opencv2/xphoto.hpp>#include <opencv2/ximgproc.hpp>#include <opencv2/calib3d.hpp>cv::Mat image2Mat(QImage image); // Qimage 转 cv::MatQImage mat2Image(cv::Mat mat); // cv::Mat 转 QImage#endif // COMMON_Hcommon.cpp#include "common.h"cv::Mat image2Mat(QImage image){ cv::Mat mat; switch(image.format()) { case QImage::Format_ARGB32: case QImage::Format_RGB32: case QImage::Format_ARGB32_Premultiplied: mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine()); cv::cvtColor(mat, mat, CV_BGRA2BGR); break; case QImage::Format_RGB888: mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine()); cv::cvtColor(mat, mat, CV_BGR2RGB); break; case QImage::Format_Indexed8: mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine()); break; } return mat;}QImage mat2Image(cv::Mat mat){ if(mat.type() == CV_8UC1) { QImage image(mat.cols, mat.rows, QImage::Format_Indexed8); // Set the color table (used to translate colour indexes to qRgb values) image.setColorCount(256); for(int i = 0; i < 256; i++) { image.setColor(i, qRgb(i, i, i)); } // Copy input Mat uchar *pSrc = mat.data; for(int row = 0; row < mat.rows; row ++) { uchar *pDest = image.scanLine(row); memcpy(pDest, pSrc, mat.cols); pSrc += mat.step; } return image; } else if(mat.type() == CV_8UC3) { const uchar *pSrc = (const uchar*)mat.data; QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); return image.rgbSwapped(); } else if(mat.type() == CV_8UC4) { const uchar *pSrc = (const uchar*)mat.data; QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32); return image.copy(); } else { return QImage(); }}DemoContrastAndBrightnessWidget.h#ifndef DEMOCONTRASTANDBRIGHTNESSWIDGET_H#define DEMOCONTRASTANDBRIGHTNESSWIDGET_H#include <QWidget>#include "common.h"namespace Ui {class DemoContrastAndBrightnessWidget;}class DemoContrastAndBrightnessWidget : public QWidget{ Q_OBJECTpublic: explicit DemoContrastAndBrightnessWidget(QWidget *parent = 0); ~DemoContrastAndBrightnessWidget();public: void setFilePath(QString filePath);protected: void updateInfo(); void updateImage();private slots: void on_pushButton_openFile_clicked(); void on_horizontalSlider_beta_sliderMoved(int position); void on_horizontalSlider_alpha_sliderMoved(int position); void on_pushButton_broswer_clicked(); void on_spinBox_beta_valueChanged(int arg1); void on_doubleSpinBox_alpha_valueChanged(double arg1); void on_pushButton_showFile_clicked(); void on_pushButton_backgroundColor_clicked();private: Ui::DemoContrastAndBrightnessWidget *ui;private: QString _filePath; cv::Mat _srcMat; QImage _srcImage; cv::Mat _dstMat; QImage _dstImage;};#endif // DEMOCONTRASTANDBRIGHTNESSWIDGET_HDemoContrastAndBrightnessWidget.cpp#include "DemoContrastAndBrightnessWidget.h"#include "ui_DemoContrastAndBrightnessWidget.h"DemoContrastAndBrightnessWidget::DemoContrastAndBrightnessWidget(QWidget *parent) : QWidget(parent), ui(new Ui::DemoContrastAndBrightnessWidget){ ui->setupUi(this);}DemoContrastAndBrightnessWidget::~DemoContrastAndBrightnessWidget(){ delete ui;}void DemoContrastAndBrightnessWidget::setFilePath(QString filePath){ _filePath = filePath; ui->lineEdit_filePath->setText(_filePath);}void DemoContrastAndBrightnessWidget::updateInfo(){ if(_srcMat.data == 0) { return; } // mat行列与图片高度是对角线反向的 ui->label_size->setText(QString("%1 x %2").arg(_srcMat.rows).arg(_srcMat.cols)); ui->label_channels->setText(QString("%1").arg(_srcMat.channels())); ui->label_depth->setText(QString("%1").arg(_srcMat.depth())); ui->label_type->setText(QString("%1").arg(_srcMat.type()));}void DemoContrastAndBrightnessWidget::updateImage(){ if(_srcImage.isNull()) { return; } cv::Mat srcMat = image2Mat(_srcImage); // 增强对比度 float r; float g; float b; _dstMat = cv::Mat::zeros(srcMat.size(), srcMat.type()); int alpha = ui->horizontalSlider_alpha->value(); // 小于1,则降低对比度 int beta = ui->horizontalSlider_beta->value(); // 负数,则降低亮度 for(int row = 0; row < srcMat.rows; row++) { for(int col = 0; col < srcMat.cols; col++) { b = srcMat.at<cv::Vec3b>(row, col)[0]; g = srcMat.at<cv::Vec3b>(row, col)[1]; r = srcMat.at<cv::Vec3b>(row, col)[2]; // 对比度、亮度计算公式 cv::saturate_cast<uchar>(value):防止溢出 _dstMat.at<cv::Vec3b>(row, col)[0] = cv::saturate_cast<uchar>(b * alpha / 100.0f + beta); _dstMat.at<cv::Vec3b>(row, col)[1] = cv::saturate_cast<uchar>(g * alpha / 100.0f + beta); _dstMat.at<cv::Vec3b>(row, col)[2] = cv::saturate_cast<uchar>(r * alpha / 100.0f + beta); } } _dstImage = mat2Image(_dstMat); ui->widget_image->setImage(_dstImage);}void DemoContrastAndBrightnessWidget::on_pushButton_openFile_clicked(){ if(!_srcImage.load(_filePath)) { qDebug() << __FILE__ << __LINE__ << "Failed to load image:" << _filePath; return; } qDebug() << __FILE__<< __LINE__ << (int)_srcImage.format(); _srcMat = image2Mat(_srcImage); updateInfo(); updateImage();}void DemoContrastAndBrightnessWidget::on_horizontalSlider_beta_sliderMoved(int position){ ui->spinBox_beta->setValue(position); updateImage();}void DemoContrastAndBrightnessWidget::on_horizontalSlider_alpha_sliderMoved(int position){ ui->doubleSpinBox_alpha->setValue(position / 100.0f); updateImage();}void DemoContrastAndBrightnessWidget::on_pushButton_broswer_clicked(){ QString dir = ui->lineEdit_filePath->text(); dir = dir.mid(0, dir.lastIndexOf("/")); QString filePath = QFileDialog::getOpenFileName(0, "打开图片", dir, "PNG;JPEG;BMP(*.png;*.jpg;*.bmp);;JPEG(*.jpg);;PNG(*.png);;BMP(*.bmp)"); if(filePath.isEmpty()) { return; } _filePath = filePath; ui->lineEdit_filePath->setText(_filePath);}void DemoContrastAndBrightnessWidget::on_spinBox_beta_valueChanged(int arg1){ ui->horizontalSlider_beta->setValue(arg1); updateImage();}void DemoContrastAndBrightnessWidget::on_doubleSpinBox_alpha_valueChanged(double arg1){ ui->horizontalSlider_alpha->setValue(arg1 * 100); updateImage();}void DemoContrastAndBrightnessWidget::on_pushButton_showFile_clicked(){ if(_dstMat.data == 0) { QMessageBox::information(this, "提示", "使用opencv显示图片失败"); return; } cv::imshow("showFile", _dstMat);}void DemoContrastAndBrightnessWidget::on_pushButton_backgroundColor_clicked(){ QColor backgroundColor = ui->widget_image->getBackgroundColor(); backgroundColor = QColorDialog::getColor(backgroundColor, this, "底色"); if(!backgroundColor.isValid()) { return; } QColor color(backgroundColor.red(), backgroundColor.green(), backgroundColor.blue()); ui->widget_image->setBackgroundColor(color);} ...

July 2, 2020 · 3 min · jiezi

OpenCV开发笔记六十五红胖子8分钟带你深入了解ORB特征点图文并茂浅显易懂程序源码

若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106926496各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)》下一篇:持续补充中… 前言 红胖子,来也! 识别除了传统的模板匹配之外就是体征点了,前面介绍了Suft特征点,还有一个传统的就会ORB特征点了。 其实识别的特征点多种多样,既可以自己写也可以使用opencv为我们提供的,一般来说根据特征点的特性和效率,选择适合我们场景的特征就可以了。 本篇,介绍ORB特征提取。 Demo ORB特征点概述 ORB是ORiented Brief的简称,是briedf算法的改进版,于2011年在《ORB:an fficient alternative to SIFT or SURF》中提出。ORB算法分为两部分,分别是特征点提取和特征点描述: 特征提取:由FAST(Features from Accelerated Segment Test)算法发展来的;特征点描述:根据BRIEF(Binary Robust IndependentElementary Features)特征描述算法改进的。 ORB特征是将FAST特征点的检测方法与BRIEF特征描述子结合起来,并在它们原来的基础上做了改进与优化。据说,ORB算法的速度是sift的100倍,是surf的10倍。 Brief描述子 该特征描述子是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,组合成一个二进制传,并将这个二进制串作为该特征点的特征描述子。 Brief的速度快,但是使用灰度值作为描述字计算的源头,毫无疑问会有一些显而易见的问题: 旋转后灰度变了导致无法识别,因其不具备旋转不变形;由于是计算灰度,噪声灰度化则无法去噪,所以对噪声敏感;尺度不同影响灰度计算,所以也不具备尺度不变形;ORB是试图使其具备旋转不变性和降低噪声敏感度而提出的。 特征检测步骤步骤一:使用brief算子的方式初步提取。 该步能够提取大量的特征点,但是有很大一部分的特征点的质量不高。从图像中选取一点P,以P为圆心画一个半径为N像素半径的圆。圆周上如果有连续n个像素点的灰度值比P点的灰度值大或者小,则认为P为特征点。 步骤二:机器学习的方法筛选最优特征点。 通俗来说就是使用ID3算法训练一个决策树,将特征点圆周上的16个像素输入决策树中,以此来筛选出最优的FAST特征点。 步骤三:非极大值抑制去除局部较密集特征点。 使用非极大值抑制算法去除临近位置多个特征点的问题。为每一个特征点计算出其响应大小。计算方式是特征点P和其周围16个特征点偏差的绝对值和。在比较临近的特征点中,保留响应值较大的特征点,删除其余的特征点。 步骤四:使用金字塔来实现多尺度不变形。步骤五:使用图像的矩判断特征点的旋转不变性 ORB算法提出使用矩(moment)法来确定FAST特征点的方向。也就是说通过矩来计算特征点以r为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。 ORB类的使用cv::Ptr<cv::ORB> _pOrb = cv::ORB::create();std::vector<cv::KeyPoint> keyPoints1;//特征点检测_pOrb->detect(srcMat, keyPoints1);ORB相关函数原型static Ptr<ORB> create(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31, int firstLevel=0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold=20);参数一:int类型的nfeatures,用于ORB的,保留最大的关键点数,默认值500;参数二:float类型的scaleFactor,比例因子,大于1时为金字塔抽取比。的等于2表示经典的金字塔,每一个下一层的像素比上一层少4倍,但是比例系数太大了将显著降低特征匹配分数。另一方面,太接近1个比例因子这意味着要覆盖一定的范围,你需要更多的金字塔级别,所以速度会受影响的,默认值1.2f;参数三:int类型的nlevels,nlevels金字塔级别的数目。最小级别的线性大小等于输入图像线性大小/功率(缩放因子,nlevels-第一级),默认值为8;参数四:int类型的edgeThreshold,edgeThreshold这是未检测到功能的边框大小。它应该大致匹配patchSize参数。;参数五:int类型的firstLevel,要将源图像放置到的金字塔级别。以前的图层已填充使用放大的源图像;参数六:int类型的WTA_K,生成定向简短描述符的每个元素的点数。这个默认值2是指取一个随机点对并比较它们的亮度,所以我们得到0/1的响应。其他可能的值是3和4。例如,3表示我们取3随机点(当然,这些点坐标是随机的,但是它们是由预定义的种子,因此简短描述符的每个元素都是从像素确定地计算出来的矩形),找到最大亮度点和获胜者的输出索引(0、1或2)。如此输出将占用2位,因此需要一个特殊的汉明距离变量,表示为NORM_HAMMING2(每箱2位)。当WTA_K=4时,我们取4个随机点计算每个点bin(也将占用可能值为0、1、2或3的2位)。;参数七:int类型的scoreType,HARRIS_SCORES表示使用HARRIS算法对特征进行排序(分数写入KeyPoint::score,用于保留最佳nfeatures功能);FAST_SCORE是产生稍微不稳定关键点的参数的替代值,但计算起来要快一点;参数八:int类型的patchSize,定向简短描述符使用的修补程序的大小。当然,在较小的金字塔层特征覆盖的感知图像区域将更大;参数九:int类型的fastThreshold,快速阈值;void xfeatures2d::SURT::detect( InputArray image, std::vector<KeyPoint>& keypoints, InputArray mask=noArray() );参数一:InputArray类型的image,输入cv::Mat;参数二:std::Vector<KeyPoint>类型的keypoints,检测到的关键点;参数三:InputArray类型的mask,默认为空,指定在何处查找关键点的掩码(可选)。它必须是8位整数感兴趣区域中具有非零值的矩阵。;void xfeatures2d::SURT::compute( InputArray image, std::vector<KeyPoint>& keypoints, OutputArray descriptors );参数一:InputArray类型的image,输入cv::Mat;参数二:std::Vector<KeyPoint>类型的keypoints,描述符不能为其已删除计算的。有时可以添加新的关键点,例如:SIFT duplicates keypoint有几个主要的方向(每个方向);参数三:OutputArray类型的descriptors,计算描述符;// 该函数结合了detect和compute,参照detect和compute函数参数void xfeatures2d::SURT::detectAndCompute( InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints, OutputArray descriptors, bool useProvidedKeypoints=false );绘制关键点函数原型void drawKeypoints( InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage, const Scalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );参数一:InputArray类型的image,;参数二:std::Vector<KeyPoint>类型的keypoints,原图的关键点;参数三:InputOutputArray类型的outImage,其内容取决于定义在输出图像。请参阅参数五的标志flag);参数四:cv::Scalar类型的color,绘制关键点的颜色,默认为Scalar::all(-1)随机颜色,每个点都是这个颜色,那么随机时,每个点都是随机的;参数五:int类型的flags,默认为DEFAULT,具体参照DrawMatchesFlags枚举如下: ...

June 23, 2020 · 4 min · jiezi

OpenCV开发笔记六十四红胖子8分钟带你深入了解SURF特征点图文并茂浅显易懂程序源码

若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106816775各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(六十三):红胖子8分钟带你深入了解SIFT特征点(图文并茂+浅显易懂+程序源码)》下一篇:持续补充中… 前言 红胖子,来也! 识别除了传统的模板匹配之外就是体征点了,前面介绍了SIFT特征点,而SUFT是改进后SIFT特征点。 Demo SURF特征点概述 SURF,即加速稳健特征(Speeded Up Robust Features)是一个稳健的图像识别和描述算法,首先于2006年发表在欧洲计算机视觉国际会议(Europeon Conference on Computer Vision,ECCV)。该算法可被用于计算机视觉任务,如物件识别和3D重构。他部分的灵感来自于SIFT算法。SURF标准的版本比SIFT要快数倍,并且其作者声称在不同图像变换方面比SIFT更加稳健。 SURF 基于近似的2D 离散小波变换响应和并且有效地利用了积分图。 在 SIFT 中, Lowe 在构建尺度空间时使用 DoG 对 LoG 进行近似。 SURF使用盒子滤波器(box_filter)对 LoG 进行近似。在进行卷积计算时可以利用积分图像(积分图像的一大特点是:计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关) ,是盒子滤波器的一大优点。而且这种计算可以在不同尺度空间同时进行。同样 SURF 算法计算关键点的尺度和位置是也是依赖与 Hessian 矩阵行列式的。 SURF算法采用了很多方法来对每一步进行优化从而提高速度。分析显示在结果效果相当的情况下SURF的速度是SIFT的3倍。SURF善于处理具有模糊和旋转的图像,但是不善于处理视角变化和光照变化。(SIFT特征是局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性) 特征检测步骤步骤一:构造Hessian矩阵,计算特征值 surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度。Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像。首先是图像中某个像素点的Hessian矩阵: 步骤二:构造高斯金字塔 相比于sift算法的高斯金字塔构造过程,sift算法速度有所提高。 在sift算法中,每一组(octave)的图像大小是不一样的,下一组是上一组图像的降采样(1/4大小);在每一组里面的几幅图像中,他们的大小是一样的,不同的是他们采用的尺度不同。而且在模糊的过程中,他们的高斯模板大小总是不变的,只是尺度改变。对于surf算法,图像的大小总是不变的,改变的只是高斯模糊模板的尺寸,当然,尺度也是在改变的。 上图中a为高斯模板保持不变,图像大小改变的情况,适用于sift算法,图b是高斯模板改变,图像大小保持不变的情况,适用于surf算法。因为surf算法没有了降采样的过程,因此处理速度得到提高。 步骤三:关键点定位 在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。 步骤四:方向确定 将经过hessian矩阵处理过的每个像素点与其3维领域的26个点进行大小比较,如果它是这26个点中的最大值或者最小值,则保留下来,当做初步的特征点。 步骤五:关键点描述 在特征点周围取一个正方形框,框的边长为20s(s是所检测到该特征点所在的尺度)。该框带方向,方向当然就是第4步检测出来的主方向了。然后把该框分为16个子区域,每个子区域统计25个像素的水平方向和垂直方向的haar小波特征,这里的水平和垂直方向都是相对主方向而言的。该haar小波特征为水平方向值之和,水平方向绝对值之和,垂直方向之和,垂直方向绝对值之和。该过程的示意图如下所示: SurfFeatureDetector类 该类是opencv中nonfree模块中的,之前没有勾选,需要需要重新勾选编译才会有的,所以按照3.4的最新版本为3.4.10,笔者重新编译了一个版本,带contrib模块,编译请参考博文《OpenCV开发笔记(三十四):红胖子带你小白式编译Qt+openCV3.4.1+opencv_contrib(全网最简单最强,可读性最高,没有之一)》,配置时,需要额外勾选下图显示的项: 编译好后,头文件和库替换,重新连接到3.4.10版本,要使用surf,需要添加头文件: #include <opencv2/xfeatures2d/nonfree.hpp> 编译时仍然报错,如下: 但是确实勾选了,配置也打出来了支持nonfree模块,也许是编译抽风了,所以重新编译一下,发现还是一样错误,索性直接定位到错误文件,修改源码, 如下图: 编译可以成功了。 SurfFeatureDetector类的使用cv::Ptr<cv::xfeatures2d::SURF> _pSurf = cv::xfeatures2d::SurfFeatureDetector::create();std::vector<cv::KeyPoint> keyPoints1;//特征点检测_pSurf->detect(srcMat, keyPoints1);SURF宏定义typedef SURF SurfFeatureDetector;typedef SURF SurfDescriptorExtractor;SURF相关函数原型static Ptr<SURF> create(double hessianThreshold=100, int nOctaves = 4, int nOctaveLayers = 3, bool extended = false, bool upright = false);参数一:double类型的hessianThreshold,默认值100,用于SURF的hessian关键点检测器的阈值;参数二:int类型的nOctaves,默认值4,关键点检测器将使用的金字塔倍频程数;参数三:int类型的nOctaveLayers,默认值3,每八度音阶的层数。3是D.Lowe纸张中使用的值。这个八度音阶数是根据图像分辨率自动计算出来的;参数四:bool类型的extended,扩展描述符标志(true-使用扩展的128个元素描述符;false-使用64个元素描述符),默认false;参数五:bool类型的upright,向上向右或旋转的特征标志(true-不计算特征的方向;faslse-计算方向),默认false;void xfeatures2d::SURT::detect( InputArray image, std::vector<KeyPoint>& keypoints, InputArray mask=noArray() );参数一:InputArray类型的image,输入cv::Mat;参数二:std::Vector<KeyPoint>类型的keypoints,检测到的关键点;参数三:InputArray类型的mask,默认为空,指定在何处查找关键点的掩码(可选)。它必须是8位整数感兴趣区域中具有非零值的矩阵。;void xfeatures2d::SURT::compute( InputArray image, std::vector<KeyPoint>& keypoints, OutputArray descriptors );参数一:InputArray类型的image,输入cv::Mat;参数二:std::Vector<KeyPoint>类型的keypoints,描述符不能为其已删除计算的。有时可以添加新的关键点,例如:SIFT duplicates keypoint有几个主要的方向(每个方向);参数三:OutputArray类型的descriptors,计算描述符;// 该函数结合了detect和compute,参照detect和compute函数参数void xfeatures2d::SURT::detectAndCompute( InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints, OutputArray descriptors, bool useProvidedKeypoints=false );绘制关键点函数原型void drawKeypoints( InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage, const Scalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );参数一:InputArray类型的image,;参数二:std::Vector<KeyPoint>类型的keypoints,原图的关键点;参数三:InputOutputArray类型的outImage,其内容取决于定义在输出图像。请参阅参数五的标志flag);参数四:cv::Scalar类型的color,绘制关键点的颜色,默认为Scalar::all(-1)随机颜色,每个点都是这个颜色,那么随机时,每个点都是随机的;参数五:int类型的flags,默认为DEFAULT,具体参照DrawMatchesFlags枚举如下: ...

June 17, 2020 · 4 min · jiezi

项目实战QtOpenCV激光射击游识别激光识别圆

若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106647346红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) Qt开发专栏:项目实战(点击传送门)OpenCV开发专栏(点击传送门) 需求 激光射击游戏,外设激光射击目标圆圈,计分游戏。 原理 使用OpenCV打开摄像头,识别圆圈,识别激光,判断激光点是否在圆圈内。 注意 需要摄像头,摄像头对准白色矩形区域,游戏钱需要先对摄像头进行手动校准,提供调整校准标定的功能,调整到圆圈和激光都可识别。 相关博客 **《项目实战:Qt+OpenCV操作摄像头拍照、调节参数和视频录制》 《OpenCV开发笔记(一):OpenCV介绍、编译》 《OpenCV开发笔记(五):OpenCV读取与操作摄像头》 《OpenCV开发笔记(七):OpenCV基础图形绘制》 《OpenCV开发笔记(十):OpenCV图像颜色通道分离和图像颜色多通道混合》 《OpenCV开发笔记(二十一):算法基础之形态学滤波-膨胀》 《OpenCV开发笔记(二十二):算法基础之形态学滤波-腐蚀》 《OpenCV开发笔记(二十八):带你学习图像识别之阈值化》 《OpenCV开发笔记(三十六):红胖子8分钟带你深入了解缩放与图像金字塔(图文并茂+浅显易懂+程序源码)》 《OpenCV开发笔记(五十三):红胖子8分钟带你深入了解模板匹配识别(图文并茂+浅显易懂+程序源码)》** Demo:激光射击游戏 v1.0.0 下载地址 CSDN:https://download.csdn.net/download/qq21497936/12507420 QQ群:1047134658(点击“文件”搜索“shootGame”,群内与博文同步更新所有可开源的源码模板) 核心代码#ifndef SHOOTGAMEWIDGET_H#define SHOOTGAMEWIDGET_H#include <QWidget>#include "OpenCVManager.h"#include <QTimer>#include <QThread>namespace Ui {class ShootGameWidget;}class ShootGameWidget : public QWidget{ Q_OBJECTpublic: explicit ShootGameWidget(QWidget *parent = 0); ~ShootGameWidget();protected slots: void slot_captureOneFrame(cv::Mat mat); bool slot_recognize(cv::Mat mat, bool show = false); void slot_timeOut();private slots: void on_pushButton_start_clicked(); void on_pushButton_out_clicked(); void on_pushButton_startCameraTest_clicked(); void on_pushButton_stopCameraTest_clicked(); void on_pushButton_add1_clicked(); void on_pushButton_dec1_clicked(); void on_pushButton_add2_clicked(); void on_pushButton_dec2_clicked(); void on_pushButton_add3_clicked(); void on_pushButton_dec3_clicked();private: void paintEvent(QPaintEvent *event); void timerEvent(QTimerEvent *event);private: Ui::ShootGameWidget *ui; OpenCVManager *_pOpenCVManager; QThread *_pOpenCVManagerThread; cv::Mat _srcMat; QImage _srcImage; int _r; int _penWidth; cv::Mat _circleMat; cv::Mat _dotMat; cv::Mat _dot2Mat; cv::Mat _dot3Mat; cv::Mat _dot4Mat; cv::Mat _dot5Mat; cv::Mat _dot6Mat; cv::Mat _dot7Mat; int _timerId; double _f; int _margin; int _count; int _totalTime; // 总时间,默认60s int _currentTime; // 当前时间 bool _running; // 是否游戏开始 QPoint _centerPoint; // 刷新圆圈的位置 bool _hitFlag; // 是否击中标志,每次刷新位置,设置false,判断是否第一次击中用于计分 int _score; // 得分 QTimer *_pTimer; // 定时器,定时减少秒数 bool _result; // 标记是否打完出结果};#endif // SHOOTGAMEWIDGET_Hvoid ShootGameWidget::on_pushButton_start_clicked(){ if(!_pOpenCVManager->startCapture(0, 800, 600)) { QMessageBox::information(0, "错误", "检测摄像头失败"); return; } ui->label_title->setVisible(false); ui->pushButton_start->setVisible(false); ui->pushButton_out->setVisible(false); ui->groupBox->setVisible(false); _hitFlag = false; _score = 0; _currentTime = _totalTime; _running = true; _result = false; _pTimer->start();}void ShootGameWidget::paintEvent(QPaintEvent *event){ if(ui->pushButton_stopCameraTest->isEnabled() || _running) { QPainter painter(this); painter.fillRect(rect(), Qt::black); painter.setPen(QPen(Qt::white, 1)); painter.drawRect(_margin, _margin, rect().width() - _margin * 2, rect().height() - _margin * 2); QPen pen = painter.pen(); pen.setWidth(10); pen.setColor(Qt::green); painter.setPen(pen); painter.drawEllipse(_centerPoint, _r/2, _r/2);// painter.setPen(QPen(Qt::red, 10));// painter.drawPoint(_centerPoint); if(_running) { painter.setPen(QPen(Qt::white, 1)); painter.drawText(300, 50, QString("得分: %1").arg(_score)); painter.drawText(500, 50, QString("倒计时: %1").arg(_currentTime)); if(_hitFlag) { painter.drawText(700, 50, QString("已击中")); }else{ painter.drawText(700, 50, QString("未击中")); } } } if(_result) { QPainter painter(this); painter.setPen(QPen(Qt::black, 4)); QFont font = painter.font(); font.setPixelSize(64); painter.setFont(font); painter.drawText(rect(), Qt::AlignCenter, QString("游戏结束,您的得分为 %1 !!!").arg(_score)); }}void ShootGameWidget::slot_timeOut(){ if(_running) { _currentTime--; if(_currentTime == 0) { if(!_pOpenCVManager->stopCapture()) { } ui->label_title->setVisible(true); ui->pushButton_start->setVisible(true); ui->pushButton_out->setVisible(true); ui->groupBox->setVisible(true); _hitFlag = false; _currentTime = _totalTime; _running = false; _pTimer->stop(); _result = true; } update(); }} ...

June 9, 2020 · 2 min · jiezi

OpenCV开发笔记六十一红胖子8分钟带你深入了解ShiTomasi角点检测图文并茂浅显易懂程序源码

若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106436768 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) OpenCV开发专栏(点击传送门)上一篇:《OpenCV开发笔记(六十):红胖子8分钟带你深入了解Harris角点检测(图文并茂+浅显易懂+程序源码)》 下一篇:持续补充中… 前言 红胖子,来也! 做识别,有时候遇到需求,比如识别一个三角形,并求得三角形三个顶点的角度,这种属于教育集合场景,还有其他类似场景,那么检测角点就显得很重要了。 Demo 图像特征三大类型边缘:图像强度发生突变的区域,其实就是高强度梯度区域;角点:两个边缘相交的地方,看起来像一个角;斑点:按特征划分的区域,强度特别高、强度特别低或具备特定纹理的区域; Shi-Tomasi角点概述 Shi-Tomasi角点检测是改进了Harris算法,次算法最原始的定义是将矩阵M的行列式与M的迹想见,再将差值进行同预先给定的预制进行比较,后来再次改进,若两个特征值中较小的一个大于最小阈值,则会得到强角点。 原理 由于Harris算法的稳定性和k值有关,Shi-Tomasi发现,角点的稳定性和矩阵M的较小特征值有关,改进的Harris算法即直接计算出矩阵M的特征值,用较小的特征值与阈值比较,大于阈值的即为强特征点。 Harris角点概述 Harris角点检测是一种基于灰度图像的角点提取算法,稳定性高,在opencv中harris角点检测的性能相对较低,因为其使用了高斯滤波。 基于灰度图像的角点检测又分为基于梯度、基于模板和基于模板梯度组合三类型的方法,而Harris算法就是基于灰度图像中的基于模板类型的算法。 Harris角点原理 人眼对角点的识别通常是通过一个局部的小窗口内完成的:如果在各个方向上移动这个小窗口,窗口内的灰度发生了较大的变化,那么说明窗口内存在角点,具体分为以下三种情况: 如果在各个方向移动,灰度几乎不变,说明是平坦区域;如果只沿着某一个方向移动,灰度几乎不变,说明是直线;如果沿各个方向移动,灰度均发生变化,说明是角点。 基本的原理,如下图: 具体的计算公式如下: 泰勒展开: 代入得到: 其中: 二次项函数本质上就是一个椭圆函数,椭圆的扁平率和尺寸是由矩阵M的两个特征值决定的。 矩阵M的两个特征值与图像中的角点,边缘,平坦区域的关系。 Harris定义角点响应函数即: 即R=Det(M)-ktrace(M)trace(M),k为经验常数0.04~0.06 。 定义当R>threshold时且为局部极大值的点时,定义为角点。 Shi-Tomasi检测角点函数原型// 重载函数:九个参数void goodFeaturesToTrack( InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask = noArray(), int blockSize = 3, bool useHarrisDetector = false, double k = 0.04);// 重载函数:十个参数void goodFeaturesToTrack( InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask, int blockSize, int gradientSize, bool useHarrisDetector = false, double k = 0.04 );参数一:InputArray类型的image,输入图像,即源图像,填Mat类的对象 即可,且须为单通道8位或者浮点型32位单通道图像;参数二:OutputArray类型的corners,检测到的角点的输出向量;参数三:int类型的maxCorners,角点的最大数据量;参数四:double类型的qualityLevel,角点检测可接受的最小特征值。其实实际用于过滤角点的最小特征是qualityLevel与图像中最大特征值的乘积。所以qualityLevel通常不会超过1(常用的值为0.10或者0.01)。检测完后所有的交点后,还要进一步提出掉一些距离较近的角点;参数五:double类型的minDistance,角点之间的最细小距离,次参数用于保证返回的角点之间的距离不小于minDistance;参数六:InputArray类型的mask,可选参数,表示感情兴的区域,默认为noArray(),若此参数非空则必须需为CV_8UC1类型,且和第一个参数image有相同的尺寸;参数七:int类型的blockSize,有默认值3,是计算导数自相关矩阵时指定的领域范围;参数八:bool类型的useHarrisDetector,只是是否使用Harris角点检测,默认为false,不使用;参数九:double类型的k,为用于设置Hessian自相关矩阵韩烈士的相对权重的权重系数,默认值为0.04; ...

May 30, 2020 · 3 min · jiezi