当前位置: 首页 > news >正文

OpenCV极坐标变换函数warpPolar的使用

学更好的别人,

做更好的自己。

——《微卡智享》

f2fc705bea7d6f4019ad9444def991bd.jpeg

本文长度为1702,预计阅读4分钟

前言

前阵子在做方案时,得了几张骨钉的图片,骨科耗材批号效期管理一直是比较麻烦的,贴RFID标签成本太高,所以一般考虑还是OCR的识别比较好,因为本身骨钉的字符是按圆印上去的,直接截取图片进行OCR没法识别,需要经过图像处理后再识别,所以这篇就是学习一下OpenCV的极坐标变换函数。

0a9b50b8a43bc304eb3b983fe49b1e9b.png

实现效果

c46d70663c2e837eaa5b470e682428e3.jpeg

源图像

95c69736b73459f13bb5000d3b30dea5.png查找出骨钉后用极坐标变换生成的图像

图像本来就是手机拍的,反光也比较厉害,所以本篇主要就是介绍极坐标变换,最后的OCR识别就不在这个范围内了。

极坐标变换函数 

void cv::warpPolar(InputArray   src, —原图像,单通道灰度图和三通道彩色图都可OutputArray dst,  —输出图像,与原图像具有相同的数据类型和通道数Size   dsize, —目标图像大小,如图不填这个值或dsize两个值中的某个值Point2f  center, —极坐标变换时原点坐标double   maxRadius, —极坐标系的极半径最大值int   flags ) —插值方法与极坐标映射方法标志。方法之间通过“+”或者“|”号进行连接

重点说明:

dsize:目标图像大小,Size(0,0)主要就是填写里面的width和height

  1. 当width和height两个值均<=0(默认),则目标图像将具有(几乎)相同的源边界圆面积

  2. 当width>0并且height <= 0,目标图像区域将与边界圆区域按比例缩放

  3. 当width和height都 > 0, 目标图像将具有给定的大小,因此边界圆的面积将缩放为dsize


flags:插值方法与极坐标映射方法标志

插值方法:图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,一般分为:

  •       INTER_NEAREST - 最邻近插值

  •       INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法

  •       INTER_AREA -区域插值

  •       INTER_CUBIC - 4x4像素邻域内的双立方插值

  •       INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

这个我们一般都默认为INTER_LINEAR - 双线性插值即可。
 

极坐标映射方法里面就三个,主要是极坐标变换、半对数极坐标变换和逆变换。

  • WARP_POLAR_LINEAR - 极坐标变换

  • WARP_POLAR_LOG - 半对数极坐标变换

  • WARP_INVERSE_MAP - 逆变换

核心来说其实就是两个极坐标变换和半对数极坐标变换,它们两个都是由圆变换为矩形,而逆变换就是针对两种变换由矩形再转为圆。逆变换在原来的flags后面用“+”连接即可。


warpPolar的起始位置和图像旋转角度

1fe39662c375bef0c183bf722d6a9220.png

极坐标变换的起始位置默认就是3点钟的方向,上图中用蓝色箭头指的就是开始的位置,从3点钟方向顺时针来进行变换。

生成的矩形默认是向下垂直排列的,按我们自己的习惯肯定还需要将图像进行旋转,所以转换完后需要用rotate做一个图像的旋转

代码如下:

//极坐标变换
//参数 flags=INTER_LINEAR 双线性插值
Mat warpPolarMat(Mat src, int flags = INTER_LINEAR + WARP_POLAR_LINEAR) {// 圆心坐标Point2f center = Point2f(src.cols / 2, src.rows / 2);// 圆的半径double maxRadius = min(center.y, center.x) - 1;// 圆的周长int circumference = maxRadius * 2 * 3.14;//输出图像Mat dst;// 极坐标变换, Size()表示OpenCV根据输入自行决定输出图像尺寸warpPolar(src, dst, Size(0, 0), center, maxRadius, flags);// 改变结果方向rotate(dst, dst, ROTATE_90_COUNTERCLOCKWISE);return dst;
}

cfb7caebbfacadf1c514bb6430512d1e.png

实现思路及完整代码

#实现步骤
1图像简单处理(灰度图、中值滤波)
2霍夫圆检测获取到图像中的骨钉
3将获取到的圆每个分别截取出来进行极坐标变换显示出来

完整代码

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;//显示窗口设置  
//参数  img 显示的图像源,
//      winname 显示的窗口名称,
//      pointx  显示的坐标x
//      pointy  显示的坐标y
void setshowwindow(Mat img, string winname, int pointx, int pointy)
{//设置显示窗口namedWindow(winname, WindowFlags::WINDOW_NORMAL);//设置图像显示大小resizeWindow(winname, img.size());//设置图像显示位置moveWindow(winname, pointx, pointy);
}//极坐标变换
//参数 flags=INTER_LINEAR 双线性插值
Mat warpPolarMat(Mat src, int flags = INTER_LINEAR + WARP_POLAR_LINEAR) {// 圆心坐标Point2f center = Point2f(src.cols / 2, src.rows / 2);// 圆的半径double maxRadius = min(center.y, center.x) - 1;// 圆的周长int circumference = maxRadius * 2 * 3.14;//输出图像Mat dst;// 极坐标变换, Size()表示OpenCV根据输入自行决定输出图像尺寸warpPolar(src, dst, Size(0, 0), center, maxRadius, flags);// 改变结果方向rotate(dst, dst, ROTATE_90_COUNTERCLOCKWISE);return dst;
}int main(int argc, char** argv) {//测试图片文件  string testfile = "E:/DCIM/imagetest/06.png";//读取图片Mat src = imread(testfile);//修改图片大小setshowwindow(src, "src", 50, 200);imshow("src", src);//灰度图Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);//中值滤波medianBlur(gray, gray, 9);//霍夫圆检测vector<Vec3f> circles;HoughCircles(gray, circles, HOUGH_GRADIENT, 1, 50, 100, 100);//绘制检测到的圆型for (size_t i = 0; i < circles.size(); ++i) {Vec3f item = circles[i];//绘制检测到的圆circle(src, Point(item[0], item[1]), item[2], Scalar(0, 0, 255));//根据圆点和半径生成矩形Rect rect = Rect(Point(item[0] - item[2], item[1] - item[2]), Point(item[0] + item[2], item[1] + item[2]));//截图到当前圆的图像Mat rectsrc = src(rect);//极坐标变换Mat rectdst, showmat;rectdst = warpPolarMat(rectsrc);//设置当前圆显示位置String title = "circle" + to_string(i);String title2 = "roi" + to_string(i);if ((i % 2) == 0) {setshowwindow(rectsrc, title, 50, rectsrc.rows * (i / 2) + 2);setshowwindow(rectdst, title2, 50 + rectsrc.cols + 2, rectsrc.rows * (i / 2) + 2);}else {setshowwindow(rectsrc, title, (rectsrc.rows + rectdst.rows) * 2 , rectsrc.rows * (i / 2) + (i % 2) + 2);setshowwindow(rectdst, title2, (rectsrc.rows + rectdst.rows) *2 + rectsrc.rows , rectsrc.rows * (i / 2) + (i % 2) + 2);}imshow(title, rectsrc);imshow(title2, rectdst);}waitKey();return 0;
}

1c6afad8802f633d58cadcdf05fc5e60.png

1fe847886a1330a8da0c8853da99c40e.png

往期精彩回顾

c7a1c26550d9267ace9e00c80a1fb4a3.jpeg

Android Aidl跨进程通讯(四)--接口回调,服务端向客户端发送数据

 

598555bff365779d31581bb37fa7e2c1.jpeg

Android Aidl跨进程通讯(三)--进阶使用

 

18c0fc73b7f89d8996a9320234446550.jpeg

Android Aidl跨进程通讯(二)--异常捕获处理

相关文章:

OpenCV极坐标变换函数warpPolar的使用

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为1702字&#xff0c;预计阅读4分钟 前言 前阵子在做方案时&#xff0c;得了几张骨钉的图片&#xff0c;骨科耗材批号效期管理一直是比较麻烦的&#xff0c;贴RFID标签成本太高&#xff0c;所以一般考虑还是…...

类与接口常见面试题

抽象类和接口的对比 抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。 从设计层面来说&#xff0c;抽象类是对类的抽象&#xff0c;是一种模板设计&#xff0c;接口是行为的抽象&#xff0c;是一种行为的规范。 相同点 接口和抽象类都不能实例化都位于继承的顶端…...

Windows mysql5.7 执行查询/开启/测试binlog---简易记录

前言&#xff1a;基于虚拟机mysql版本为5.7&#xff0c;增量备份测试那就要用到binlog… 简述&#xff1a;二进制日志&#xff08;binnary log&#xff09;以事件形式记录了对MySQL数据库执行更改的所有操作。 binlog是记录所有数据库表结构变更&#xff08;例如CREATE、ALTER…...

文档安全加固:零容忍盗窃,如何有效预防重要信息外泄

文档安全保护不仅需要从源头着手&#xff0c;杜绝文档在使用和传播过程中产生的泄密风险&#xff0c;同时还需要对文档内容本身进行有效的保护。为了防范通过拷贝、截屏、拍照等手段盗窃重要文档内容信息的风险&#xff0c;迅软DSE加密软件提供了文档加密保护功能&#xff0c;能…...

前端如何设置模板参数

1.背景&#xff1a; 最近接到一个需求&#xff0c;在一个类似chatGpt的聊天工具中&#xff0c;要在对话框中设置模板&#xff0c;后端提供了很多模板参数&#xff0c;然后要求将后端返回的特殊字符转成按钮&#xff0c;编辑完成后在相应的位置拼接成字符串。 2.效果&#xff1a…...

06 使用v-model实现双向数据绑定

概述 Vue achieves two-way data binding by creating a dedicated directive that watches a data property within your Vue component. The v-model directive triggers data updates when the target data property is modified on the UI. Vue 通过创建一个专用指令来观…...

【C++11特性篇】C++11中新增的initializer_list——初始化的小利器(2)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C11系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.探究std::initializer_list是什么…...

计算机网络传输层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议&#xff08;必考&#xff09;TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…...

【STM32入门】4.1中断基本知识

1.中断概览 在开展红外传感器遮挡计次的实验之前&#xff0c;有必要系统性的了解“中断”的基本知识. 中断是指&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转…...

HCIA-H12-811题目解析(3)

1、【单选题】 以下关于路由器的描述&#xff0c;说法错误的是&#xff1f; 2、【单选题】某网络工程师在输入命令行时提示如下信息&#xff1a;Error:Unrecognized command foun at position.对于该提示信息说法正确的是&#xff1f; 3、【单选题】如下图所示的网络&#xf…...

【异步绘制】UIView刷新原理 与 异步绘制

快捷目录 壹、 iOS界面刷新机制贰、浅谈UIView的刷新与绘制概述一.UIView 与 CALayer1. UIView 与 CALayer的关系2. CALayer的一些常用属性contents属性contentGravity属性contentsScale属性maskToBounds属性contentsRect属性 二.View的布局与显示1.图像显示原理2.布局layoutSu…...

[ERROR] ocp-server-ce-py_script_start_check-4.2.1 RuntimeError: ‘tenant_name‘

Oceanbase 安装成功后关闭OCP&#xff0c;在重新启动时报错 使用OBD 启动OCP报如下错误 [adminobd ~]$ obd cluster start ocp Get local repositories ok Search plugins ok Open ssh connection ok Load cluster param plugin ok Check before start ocp-server x [ERROR] …...

模拟实验中经常遇到的问题和常用技巧

简介 最近在进行新文章的数值模拟阶段。上一次已经跟读者们分享了模拟实验的大致流程&#xff0c;见&#xff1a;数值模拟流程记录和分享 。 本文是在前提下&#xff0c;汇总了小编在模拟实验中经常遇到的问题和常用技巧。 文章目录 简介1. 隐藏输出结果自动创建文件夹保存多…...

微信小程序(二) ——模版语法1

文章目录 wxml模板语法拼接字符数据绑定 wxml模板语法 拼接字符 <image src"{{test1src}}" mode""/>数据绑定 在data中定义数据&#xff0c;吧数据定义到data对象中在wxml中使用数据不论是绑定内容还是属性都是用 {{}} 语法 动态绑定内容 *声明…...

牛客小白月赛83 解题报告

题目链接&#xff1a; https://ac.nowcoder.com/acm/contest/72041#question A题 解题思路 签到 代码 #include <bits/stdc.h> using namespace std;int main() {int a, b, c, d, e;cin >> a >> b >> c >> d >> e;int A, B, C, D…...

蓝桥杯专题-真题版含答案-【三角螺旋阵】【干支记年法】【异或加密法】【金字塔】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

鸿蒙篇——初次使用鸿蒙原生编译器DevEcoStudio创建一个鸿蒙原生应用遇到的坑--汇总(持续更新)

前言&#xff1a;欢迎各位鸿蒙初学者、开发者来本帖交流讨论&#xff0c;包含各位遇到的问题、鸿蒙的bug、解决方法等等&#xff0c;我会收集有效的内容更新到本文章中。 背景&#xff1a;2023年12月13日&#xff0c;使用DevEcoStudio 4.0.0.600版本&#xff0c;项目的compileS…...

细胞培养之一二三:哺乳动物细胞培养污染问题和解决方案

一、哺乳动物细胞污染是什么[1]&#xff1f; 污染通常是指在细胞培养基中存在不需要的微生物、不需要的哺乳动物细胞和各种生化或化学物质&#xff0c;从而影响所需哺乳动物细胞的生理和生长。由于微生物在包括人体特定部位在内的环境中无处不在&#xff0c;而且它们的繁殖速度…...

《Linux C编程实战》笔记:文件属性操作函数

获取文件属性 stat函数 在shell下直接使用ls就可以获得文件属性&#xff0c;但是在程序里应该怎么获得呢&#xff1f; #include<sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *file_name,struct stat *buf); int fstat(i…...

linux中的网络知识

网络 认识基本网络网络划分计算机网络分为LAN、MAN、WAN公网ip和私网ip 传输介质单位换算客户端和服务端 OSI模型osi七层模型TCP/IP:传输控制协议簇HTTP协议简介UDP协议介绍物理地址&#xff1a;mac地址&#xff0c;全球唯一&#xff0c;mac由6段16进制数组成&#xff0c;每段有…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...