将圆环区域展开成矩形长条

在机器视觉领域,经常会遇到圆环型的检测目标,比如瓶口,轮胎,橡皮圈等等,比如想检测轮胎上的瑕疵,就可以通过把环形区域展开成矩形形状,然后对胎侧进行瑕疵检测,再比如对圆环扣上的字符进行识别,也可以利用该方法,当然也可以直接利用弯曲文本标注进行识别。那么具体如何实现环形区域展开成矩形长条呢?代码如下:

算法实现代码:


#include <opencv2/highgui/highgui.hpp>    
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include<opencv2/imgproc/types_c.h> 
#include<opencv2/opencv.hpp>
#include <iostream> 
using namespace std;cv::Mat UTCH::Method::CircleToRectangle(const cv::Mat& circle, const cv::Point& Center, int Radius, int RingStride)
{cv::Mat rectangle;rectangle = cv::Mat::zeros(cv::Size(Radius * CV_PI * 2, RingStride), CV_8UC1);//矩形长为int nl = rectangle.rows;   // number of lines					int nc = rectangle.cols * rectangle.channels();   // total number of elements per linefor (int j = 0; j < nl; j++) {// get the address of row juchar* data = rectangle.ptr<uchar>(j);for (int i = 0; i < nc; i++) {// process each pixel ---------------------double theta = CV_PI * 2.0 / float(nc) * float(i + 1);double rho = Radius - j - 1;  //-1防止超界int position_x = (float)Center.x + rho * (float)std::cos(theta) + 0.5;// +0.5四舍五入int position_y = (float)Center.y - rho * (float)std::sin(theta) + 0.5;// +0.5四舍五入data[i] = circle.at<uchar>(position_y, position_x);// end of pixel processing ----------------} // end of line}return rectangle;
}

主函数代码:

#include "myalgrithom.h"
#include <iostream> 
#include<windows.h>
using namespace std;int main()
{//读取彩色图像std::string strImgFile = "image/yinzhang.jpg";cv::Mat img = cv::imread(strImgFile);if (img.empty()){std::cout << "image file read failed - " << strImgFile.c_str() << "!" << std::endl;return 0;}//转换灰度图cv::Mat gray;cvtColor(img, gray, cv::COLOR_BGR2GRAY);//GaussianBlur(gray, gray, Size(5, 5), 1.0);//检测最大的圆std::vector<cv::Vec3f> circles;HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1, 50, 50);//根据检测目标,参数自己调cv::Mat img_copy;img.copyTo(img_copy);int nMaxRadius = 0;cv::Point center;for (int i = 0; i < circles.size(); i++){cv::Vec3f cc = circles[i];//检测到圆的圆心和半径if (nMaxRadius < cc[2]){nMaxRadius = int(cc[2] + 0.5);center = cv::Point(cc[0], cc[1]);}//circle(img_copy, cv::Point(cc[0], cc[1]), cc[2], cv::Scalar(0, 255, 0), 2, cv::LINE_AA);//circle(img_copy, cv::Point(cc[0], cc[1]), 3, cv::Scalar(125, 25, 255), 2, cv::LINE_AA);}circle(img_copy, center, nMaxRadius, cv::Scalar(0, 255, 0), 2, cv::LINE_AA);circle(img_copy, center, 3, cv::Scalar(125, 25, 255), 2, cv::LINE_AA);//将最大的圆环展平,圆环高度为半径的一半cv::Mat result;result=UTCH::Method::CircleToRectangle(gray, center, nMaxRadius, nMaxRadius / 2);cv::flip(result, result,1);if (result.empty()){std::cout << "result is empty!" << std::endl;return 0;}else{//显示结果imshow("result", result);imwrite("result/result.jpg", result);cv::waitKey(0);cv::destroyAllWindows();}
}

其中,输入为
Mat& circle:输入的圆环形原始图像

原图如下

检测到的圆形如下绿线圈出


Point Center: 原始图像中圆环的圆心
int Radius: 原始图像中圆环的半径
int RingStride:圆环的宽度

最终生成的矩形长条,以圆环的外周长为长,以圆环的宽度为高。

转换后结果图:


函数中,从圆环的最外圈开始遍历,最外圈即对应着矩形中的第一行,宽度为多少,则矩形中就有多少行

以圆心为中心构成极坐标系,则圆环上任意一点可以用rho和theta来表示
再根据公式计算出该点在图上的真是坐标,把像素值赋给矩形框中对应的位置。

注:代码并不是拷贝下来就能直接使用的哦,根据自己的情况去修改调试哦,加油宝子们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024大厂Android面试集合,安卓开发面试书籍

前言 早在2017年我们就建了第一个进击BAT的Android开发进阶交流群&#xff0c;两年期间很多群友都分享了自己的Android面试经历。其中就有很多群友已经斩获蚂蚁金服&#xff0c;天猫&#xff0c;高德&#xff0c;盒马等阿里系offer 收集反馈的面经资料比较乱&#xff0c;最近…

2024BAT大厂Java社招最全面试题,成功入职字节跳动

前言 现在Java程序员面试都是因为没有丰富的工作经验和自己过硬的技术&#xff0c;所有都不知道一般互联网应该会问什么技术问题&#xff0c;加上自己可能去面试的时候没有准备的太充分&#xff0c;一面试刚跟面试官扯几个面试题就不知道自己在哪里了&#xff0c;被怼的体无完…

● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

● 198.打家劫舍 动规五部曲。 1、dp[j]含义。前j个房屋偷到的金额之和最大是dp[j]。 2、递推公式。递推公式要得出dp[i]&#xff0c;就是要确定第i个房屋是否打劫&#xff0c;那么也跟之前的背包问题一样&#xff0c;放与不放&#xff0c;对应的是两种结果&#xff0c;我们只需…

旺泓_光感WH3620_数字RGBW-IR色彩传感器

由工采网代理的WH3620是一种基于颜色的光到数字转换器;它集光电二极管、电流放大器、模拟电路和数字信号处理器于一体&#xff1b;提供红、绿、蓝、白和红外光传感&#xff1b;能调节屏幕或灯光白平衡&#xff1b;各通道同时并行输出&#xff0c;因此在白光LED、CWF、TL84、D65…

防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五

1. OceanBase为什么要做巡检功能 尽管OceanBase拥有很好的MySQL兼容性&#xff0c;但在长期的生产环境中&#xff0c;部署不符合标准规范、硬件支持异常&#xff0c;或配置项错误等问题&#xff0c;这些短期不会出现的问题&#xff0c;仍会对数据库集群构成潜在的巨大风险。为…

脾胃论笔记

焦虑会导致脾胃受伤 焦虑等不良情绪也会导致脾胃受伤&#xff0c;我们称其为肝气不舒。肝气不舒会导致脾胃系统出问题&#xff0c;这叫肝木横逆克脾土&#xff0c;木克土&#xff0c;脾胃就容易受伤。 这样的情况在现代社会特别多。这跟古人就不一样&#xff0c;古人生活相对…

Python爬虫——Requests

目录 简介 基本使用​编辑 ​编辑 安装 一个类型和六个属性 请求类型 GET 代码示例 POST 代码示例 代理 古诗文网绕过验证码登录 总结 简介 Python的Requests库是一个用于发送HTTP请求的常用库。它提供了简单且人性化的API&#xff0c;使得发送HTTP请求变得非常容易。…

完美解决VMware中配置suse10虚拟机网络

一、注意&#xff01;&#xff01;&#xff01;配置suse10网络&#xff0c;需要在虚拟机关机状态下进行&#xff0c;否则会配置不成功&#xff1b; 二、配置与主机在同一网段(仅主机模式&#xff0c;网卡一)&#xff1b; 在suse系统关机状态下&#xff0c;Vmware中设置”虚拟网…

2024华为Android高级面试题及答案,android系统工程师面试

大厂offer是每个技术人的追求? 我觉得每一个程序员的梦想大概就是能够找一份大厂的 Offer&#xff0c;我觉得这很正常&#xff0c;这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/…

0.8秒一张图40hx矿卡stable diffusion webui 高质极速出图组合(24.3.3)

新消息是。经过三个月的等待&#xff0c;SD Webui (automatic1111)终于推出了新版本1.8.0&#xff0c;本次版本最大的更新&#xff0c;可能就是pytorch更新到2.1.2, 不过还是晚了pytorch 2.2.2版。 不过这版的一些更新&#xff0c;在forget分支上早就实现了&#xff0c;所以。…

2核4G云服务器就服阿里云,这性能无敌了

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

一文了解74HCT14D的引脚图、符号、封装、数据手册及应用

74HCT14D 是一款采用硅栅 C2MOS 技术制造的高速 CMOS 施密特逆变器。它实现了类似于等效 LSTTL 的高速操作&#xff0c;同时保持 CMOS 的低功耗。该器件可用作电平转换器&#xff0c;用于将 TTL 或 NMOS 连接到高速 CMOS。 输入与 TTL、NMOS 和 CMOS 输出电压电平兼容。所有输入…

什么是工业级物联网智能网关?如何远程控制PLC?

在这个信息爆炸的时代&#xff0c;物联网技术已经逐渐渗透到我们生活的方方面面&#xff0c;而工业级物联网智能网关作为连接工业设备和云端的重要桥梁&#xff0c;更是引领着工业4.0时代的浪潮。那么&#xff0c;究竟什么是工业级物联网智能网关呢&#xff1f;今天&#xff0c…

Python网络请求高级篇:Requests库的深度运用

在Python网络请求中级篇中&#xff0c;我们了解了如何通过Requests库发送带参数的请求&#xff0c;处理Cookies&#xff0c;使用Session对象&#xff0c;以及设置请求头。在本文中&#xff0c;我们将进一步深入学习Requests库的高级功能&#xff0c;包括处理重定向&#xff0c;…

Codesys 位置式PID闭环控制系统(PID+PWM控制无刷电机)

有关Codesys位置式PID算法公式和源代码,请参考下面文章链接: 1、Codesys位置式PID https://rxxw-control.blog.csdn.net/article/details/131591254https://rxxw-control.blog.csdn.net/article/details/1315912542、博途PLC PWM输出控制 https://rxxw-control.blog.csdn.…

Flink基本原理 + WebUI说明 + 常见问题分析

Flink 概述 Flink 是一个用于进行大规模数据处理的开源框架&#xff0c;它提供了一个流式的数据处理 API&#xff0c;支持多种编程语言和运行时环境。Flink 的核心优点包括&#xff1a; 低延迟&#xff1a;Flink 可以在毫秒级的时间内处理数据&#xff0c;提供了低延迟的数据…

证件照制作繁琐?学会这三招轻松制作专业级证件照!

朋友们&#xff0c;您是否曾经为了办理各种证件、报名考试或者求职简历中的证件照而烦恼呢&#xff1f;是否希望能在家就能便捷高效地制作出符合规格的专业证件照&#xff1f;今天我将为大家推荐三款国内外备受好评的证件照处理工具&#xff0c;让您随时随地拥有完美证件照&…

【prompt四】Domain Prompt Learning for Efficiently Adapting CLIP to Unseen Domains

motivation 领域泛化(DG)是一个复杂的迁移学习问题,旨在学习未知领域的可泛化模型。最近的基础模型(FMs)对许多分布变化都具有鲁棒性,因此,应该从本质上提高DG的性能。在这项工作中,我们研究了采用视觉语言基础模型CLIP来解决图像分类中的DG问题的通用方法。虽然ERM使用标…

音视频开发之旅——音频基础概念、交叉编译原理和实践(LAME的交叉编译)(Android)

本文主要讲解的是音频基础概念、交叉编译原理和实践&#xff08;LAME的交叉编译&#xff09;&#xff0c;是基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo 音频基础概念 在进行音频开发的之前&#xff0c;了解声学的基础还是很有必要的。 声音…

K线实战分析系列之二十二:圆形顶部和圆形底部形态

K线实战分析系列之二十二&#xff1a;圆形顶部和圆形底部形态 一、圆形顶部形态二、圆形顶部和圆形底部形态的总结 一、圆形顶部形态 市场多空一方被逐渐击退&#xff0c;跳空的缺口是一方突然发力&#xff0c;体现出一方对市场掌握了控制权 二、圆形顶部和圆形底部形态的总结…