首页 > 编程语言 >C++ OpenCv二值化找圆心坐标

C++ OpenCv二值化找圆心坐标

时间:2024-11-05 11:58:32浏览次数:1  
标签:leftPoint OpenCv topPoint C++ cv tempPoint bottomPoint rightPoint 二值化

思路:图像转为灰度图,然后二值化得到只有0或255的点坐标,此处圆是黑点,所以添加所有像素值为0的坐标。在这些坐标中找到圆上最左边、最顶端、最右边、最底端的四个点,这时可求出圆心坐标。

 

.cpp文件


#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <map>
#include <any>


// 1.获取图片 cv::Mat src = cv::imread("D:\\1.bmp"); // 2.将彩色图像转换为灰度图像 cv::Mat gray_image; cv::cvtColor(src, gray_image, cv::COLOR_BGR2GRAY); // 3.二值化处理 cv::Mat dst; cv::threshold(gray_image, dst, threshold, 255, cv::THRESH_BINARY); // 4.找到所有目标坐标 cv::Point leftPoint; cv::Point rightPoint; cv::Point topPoint; cv::Point bottomPoint; std::vector<cv::Point> points; for (int i = 0; i < dst.rows; ++i) { for (int j = 0; j < dst.cols; ++j) { if (dst.at<uchar>(i, j) != 255) { // 0:白色、255:黑色 cv::Point tempPoint = cv::Point(j, i); // 去除边缘干扰点位,按实际需求添加 if (j < 50 || i < 50) { continue; } // 赋值初始坐标 if (leftPoint.x == 0 && leftPoint.y == 0) { leftPoint = tempPoint; } if (rightPoint.x == 0 && rightPoint.y == 0) { rightPoint = tempPoint; } if (topPoint.x == 0 && topPoint.y == 0) { topPoint = tempPoint; } if (bottomPoint.x == 0 && bottomPoint.y == 0) { bottomPoint = tempPoint; } points.push_back(tempPoint); // 注意OpenCV的坐标系是(列,行) //else { if (leftPoint.x == 0 || tempPoint.x < leftPoint.x) { leftPoint = tempPoint; } if (topPoint.y == 0 || tempPoint.y < topPoint.y) { topPoint = tempPoint; } if (rightPoint.x == 0 || tempPoint.x > rightPoint.x) { rightPoint = tempPoint; } if (bottomPoint.y == 0 || tempPoint.y > bottomPoint.y) { bottomPoint = tempPoint; } //} } } } // 5.求圆半径, int r1 = rightPoint.x - leftPoint.x; int r2 = bottomPoint.y - topPoint.y; int r = (r1 + r2) / 2;

// 6.求圆心坐标
cv::Point circleCenter(leftPoint.x + r, topPoint.y + r);

// 7.对圆画框
// 7.1.定义矩形的左上角和右下角坐标
cv::Point2f rect_start(leftPoint.x, topPoint.y);
cv::Point2f rect_end(rightPoint.x, bottomPoint.y);

// 7.2.画矩形框
cv::rectangle(src, rect_start, rect_end, cv::Scalar(0, 255, 0));

 

标签:leftPoint,OpenCv,topPoint,C++,cv,tempPoint,bottomPoint,rightPoint,二值化
From: https://www.cnblogs.com/resplendent/p/18527563

相关文章

  • (C++实现)2-NAF
    (C++实现)2-NAF前言‍任何一个非负整数,都有一个唯一的NAF(Non-adjacentform)表示。因着课程的缘由,我不得不研究一下NAF是怎么实现的,也是现学现用。‍Note:‍采用C++实现一篇很短的博客,专注于2-NAF‍‍目录‍目录(C++实现)2-NAF前言目录定义实现V1,最low......
  • (3)---【C语言】【GL库】【计算机图形学】DEV C++ 平台openGL库 下的画线图案设计 房
    声明:        由于本人是一名学生,现阶段还要完成学业,所以我们每周假期再回!谢谢大家理解和支持!上篇上手实践  运行结果 实现代码#include<windows.h>#defineGLUT_DISABLE_ATEXIT_HACK//处理不同系统的配置问题的宏#include<GL/glut.h>#include<std......
  • 每日OJ题_牛客_相差不超过k的最多数_滑动窗口_C++_Java
    目录牛客_相差不超过k的最多数_滑动窗口题目解析C++代码Java代码牛客_相差不超过k的最多数_滑动窗口相差不超过k的最多数_牛客题霸_牛客网(nowcoder.com)描述:        给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 k 。问最多能选择多少......
  • 【c++篇】:深入剖析vector--模拟实现属于自己的c++动态数组
    ✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨✨个人主页:余辉zmh–CSDN博客✨文章所属专栏:c++篇–CSDN博客文章目录前言一.`vector`类的默认成员函数整体框架构造函数析构函数拷贝构造函数赋值运算符重载函数测试二.`vector`......
  • C++ 逆序乘积式
     题目描述【问题描述】若两个正整数的乘积,等于两正整数各自逆序后的乘积,则称其为逆序乘积式。编写程序读入两个正整数,然后判断这两个正整数能否构成逆序乘积式。假设两个正整数的乘积不会超过int数据类型的表示范围。【输入形式】从控制台输入以一个空格分隔的两个正整数......
  • HarmonyOS 开发实践——基于HAR的跨模块C++头文件引用
    ......
  • RBE104TC C/C++ Programming
    RBE104TC C/C++ Programming Language Assignment 2ContributiontotheOverallMarks70%IssueDate SubmissionDeadline3rdNovember2024AssignmentOverview: This assignment is geared towards assessing fundamental co......
  • opencv 图像预处理(一) python笔记
    图像预处理​在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作:图像空间转换图像大小调整图像仿射变换图像翻转图像裁剪图像二值......
  • C++ 中类的三大特性是什么?
    封装:封装是将数据和操作数据的方法捆绑在一起,形成一个类。通过封装,类的内部实现细节被隐藏起来,只对外提供公共的接口。这样做有以下几个好处:数据安全性:封装可以防止外部代码直接访问和修改类的内部数据,只能通过类提供的方法进行操作。这样可以保证数据的安全性和完整性,避免因......
  • 算法|牛客网华为机试31-40C++
    牛客网华为机试上篇:算法|牛客网华为机试21-30C++文章目录HJ31单词倒排HJ32密码截取HJ33整数与IP地址间的转换HJ34图片整理HJ35蛇形矩阵HJ36字符串加密HJ37统计每个月兔子的总数HJ38求小球落地5次后所经历的路程和第5次反弹的高度HJ39判断两个IP是否属于同一子......