• 工具
    win10+python3.8 + opencv-python

  • 功能说明
    1、分别寻找红色和绿色圆形
    2、标记圆心和轮廓
    3、连接两个红色圆形和绿色圆形
    4、以红色圆形位置为基准点,移动绿色圆形移动到红色圆形位置

  • 涉及到函数
    1、寻找圆形
    2、绘制直线
    3、计算夹角
    4、计算偏移量
    5、旋转图片和偏移图片

  • 具体代码如下:

# -*- coding:utf-8 -*-
"""
File Name: pro_1
Author: 82405
Data: 2020/6/23 10:39
-----------------------
Info:-----------------------
Change Activity:2020/6/23: create
"""
import logging
import math
import numpy as np
import cv2logger = logging.getLogger(__file__)def angle(red_line, green_line):"""计算两条直线夹角:param red_line::param green_line::return:"""if red_line[0][0] < red_line[1][0]:v1 = [red_line[0][0], 0 - red_line[0][1], red_line[1][0], 0 - red_line[1][1]]else:v1 = [red_line[1][0], 0 - red_line[1][1], red_line[0][0], 0 - red_line[0][1]]if green_line[0][0] < green_line[1][0]:v2 = [green_line[0][0], 0 - green_line[0][1], green_line[1][0], 0 - green_line[1][1]]else:v2 = [green_line[1][0], 0 - green_line[1][1], green_line[0][0], 0 - green_line[0][1]]dx1 = v1[2] - v1[0]dy1 = v1[3] - v1[1]dx2 = v2[2] - v2[0]dy2 = v2[3] - v2[1]angle1 = math.atan2(dy1, dx1)angle1 = int(angle1 * 180 / math.pi)# print(angle1)angle2 = math.atan2(dy2, dx2)angle2 = int(angle2 * 180 / math.pi)# print(angle2)if angle1 * angle2 >= 0:included_angle = abs(angle1 - angle2)else:included_angle = abs(angle1) + abs(angle2)if included_angle > 180:included_angle = 360 - included_anglereturn included_angledef cal_offset(red_line, green_line):"""计算偏移量:param red_line::param green_line::return:"""if red_line[0][0] < red_line[1][0]:red_left_p = red_line[0]else:red_left_p = red_line[1]if green_line[0][0] < green_line[1][0]:green_left_p = green_line[0]else:green_left_p = green_line[1]print(int(red_left_p[0]) - int(green_left_p[0]), int(red_left_p[1]) - int(green_left_p[1]))return np.float32([[1, 0, int(red_left_p[0]) - int(green_left_p[0])], [0, 1, int(red_left_p[1]) - int(green_left_p[1])]])planets = cv2.imread('lh_002.jpg')
# print(planets.shape)
rows, cols, w = planets.shape
gray_img = cv2.cvtColor(planets, cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(gray_img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)# 圆形寻找
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 120, param1=100, param2=30, minRadius=0, maxRadius=0)circles = np.uint16(np.around(circles))red_point = []  # 红色点
green_point = []  # 绿色点for i in circles[0, :]:# print(i)if i[2] > 50:continuepx = planets[i[1], i[0]]    # 获取该像素的RGB值# print('坐标[{}, {}]RGB{}'.format(i[1], i[0], px))if px[1] > 200 and px[2] < 200:  # 判断红绿print('绿色圆圈 绘制红色')cv2.circle(planets, (i[0], i[1]), 50, (0, 0, 255), 2)  # 绘制圆形轮廓cv2.circle(planets, (i[0], i[1]), 2, (0, 0, 255), 3)  # 绘制圆形圆心green_point.append((i[0], i[1]))else:print('红色圆圈 绘制绿色')cv2.circle(planets, (i[0], i[1]), 50, (0, 255, 0), 2)  # 绘制圆形轮廓cv2.circle(planets, (i[0], i[1]), 2, (0, 255, 0), 3)  # 绘制圆形圆心red_point.append((i[0], i[1]))# cv2.imwrite('lh_000.jpg', planets)
print(red_point)
print(green_point)
cv2.line(planets, red_point[0], red_point[1], (255, 0, 0), 2)
cv2.line(planets, green_point[0], green_point[1], (255, 0, 0), 2)
angle_val = angle(red_point, green_point)  # 计算夹角
mat_translation = cal_offset(red_point, green_point)  # 计算偏移量
if green_point[0][0] > green_point[1][0]:  # 判断绿线定位点 去x轴值小的那个点M = cv2.getRotationMatrix2D(green_point[1], 0 - angle_val, 1)  # 旋转
else:M = cv2.getRotationMatrix2D(green_point[0], 0 - angle_val, 1)  # 旋转
dst = cv2.warpAffine(planets, M, (cols, rows))  # 旋转
dst = cv2.warpAffine(dst, mat_translation, (cols, rows))  # 偏移cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.namedWindow('image_dist', cv2.WINDOW_NORMAL)
cv2.imshow('image', planets)
cv2.imshow('image_dist', dst)
cv2.waitKey()
cv2.destroyAllWindows()
  • 原图

  • 最终效果图

python-opencv-寻找不同颜色圆形以及连线、标记轮廓和圆心相关推荐

  1. opencv 寻找轮廓线与轮廓线的交点, 轮廓与圆的交点

    opencv 寻找轮廓线与圆的交点 在项目过程中 我遇到了一个问题就是要求一段不规则轮廓线与一个圆的交点,网上查了一些资料,如果轮廓线是规则的话还能算出轮廓线的方程可以方便的解出交点,但是现在轮廓线是 ...

  2. Python+Opencv寻找图像中最亮的区域

    目录 一.场景需求解读 二.算法原理简介 三.算法代码实现 四.代码运行步骤 五.算法效果展示和分析 六.思维扩展 参考资料 注意事项 一.场景需求解读   在有些现实场景中,我们需要去使用算法自动的 ...

  3. 使用python+OpenCV实现抖音特效“蓝线挑战”

    使用OpenCV实现抖音"蓝线挑战"特效.原理比较简单,当蓝线在视频画面中滑动,然后从滑过的每一帧中截取部分画面生成一幅静态图片,由于上一帧画面已经定格,那么通过调整下一帧画面可以 ...

  4. Python Opencv 图片识别表格:边框线检测

    Python数据开发工作需求对图片做边框线检查和图片中的直线,非常实用建议收藏 文章目录 安装模块 1. 判断图片中是否有表格 2. 提取图片中的直线 千人全栈VIP答疑群联系博主帮忙解决报错 书籍推 ...

  5. 使用Python+OpenCV+dlib为人脸生成口罩

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  6. 面部表情识别java_使用Python+OpenCV+dlib为人脸生成口罩

    来源:深度学习与计算机视觉 本文约4800字,建议阅读6分钟本文试图用OpenCV和dlib库来实现这个过程,在这里我们综合生成5种类型的口罩来绘制人脸图像. 本文使用OpenCV dlib库生成口罩 ...

  7. python open-cv 基础知识总结(三)

    上一章:python open-cv 基础知识总结(二) 1. 轮廓中心计算 本教程的目标是 (1)  检测图像中每个形状的轮廓, (2)  计算轮廓的中心 -也称为区域的  质心 . 为了实现这些目 ...

  8. python图像识别马路_使用Python和OpenCV在道路上找到车道线

    识别道路上的车道是所有司机的共同任务,以确保车辆在驾驶时处于车道限制之内,并减少因越过车道而与其他车辆发生碰撞的机会. 对自动驾驶汽车来说,这同样也是一项关键任务.事实证明,使用计算机视觉技术识别道路 ...

  9. python+opencv车道线检测(简易实现)

    python+opencv车道线检测(简易实现) 技术栈:python+opencv 实现思路: canny边缘检测获取图中的边缘信息: 霍夫变换寻找图中直线: 绘制梯形感兴趣区域获得车前范围: 得到 ...

最新文章

  1. WinAPI: GetSystemDirectory - 返回 System 文件夹路径
  2. Spring xml 配置使用外部config 文件
  3. 技术贴]强大的DELPHI RTTI–兼谈需要了解多种开发语言
  4. ​从熵不变性看Attention的Scale操作
  5. Mealy状态机的一点理解
  6. linux 命令 抛后台,在后台运行Linux命令的方法
  7. RelativeLayout重要属性
  8. Ubuntu主题更换
  9. 4款bt search
  10. 菜鸟评python,F#,Go
  11. np.dot、np.outer、np.matmul、np.multipy、np.inner、np.outer与np.cross几个函数之间的区别
  12. 理解OpenContrail(by quqi99)
  13. 一座城市靠税收能年入多少钱?
  14. 机械键盘入门:教你如何正确选择机械键盘!学习游戏两不误
  15. 前端森林:万物皆可快速上手之Electron(第一弹)
  16. html文字段落设置,p字间距 html段落内文字设置字间距间隔
  17. 【C语言】fwrite 写如0X0A时,自动添加0X0D的解决方法
  18. 2022年第五届中青杯数学建模-时间序列预测模型及基于多特征条件下的决策优化
  19. 同时删除多个 PDF 文档前几页
  20. 《上海市优质中小企业梯度培育管理实施细则》的通知

热门文章

  1. Arduino ESP8266对AT24C02模块读写操作实例
  2. 2022年各国程序员编程水平排行榜出炉,排名第一的国家没听说过
  3. App测试基本流程以及注意事项
  4. 博士Science发文:后悔为科研牺牲健康,“卷”坏身体!
  5. android中有米广告报错java.lang.NoClassDefFoundError: net.youmi.android.AdManager
  6. React 中的受控组件和非受控组件的区别
  7. java倒计时跳出窗口_java 窗口 倒计时 关闭
  8. M.U.G.E.N格斗游戏引擎简介
  9. Tampermonkey插件开发-0001
  10. 如何维护固态继电器?