Opencv通过颜色区分电线

2023-11-05

Opencv检测不同颜色的电线是否接好

机器视觉检测物体要根据检测对象的特征找到最方便快捷的方法,最近做了一个靠颜色像素来区分电线的小项目,颜色区分是inRange方法,这个方法检测的是HSV彩色图像的范围,需要将图像转换为HSV图像。
在这里插入图片描述
如图,要检测图中六条线是否都接好并且位置没有错误,观察背景,大多都是灰黑色的物体,只有这些电线颜色比较鲜明,因此选择用颜色像素来区分。
设计算法:其实也没有什么算法,每个线的颜色范围,就是用制图工具来采集一下各个颜色的BGR像素范围,因为每条线的亮度并不完全一样,只要获取看起来最亮的一点和看起来最暗的一点,就能获取到每天直线的颜色像素范围,但是要检测的不仅仅是存不存在,还要检测各个线的位置是否正确,由于这张图较大,所以应该先获取到电线的大概位置,那么就要利用图中其他明显的特征,如图,下面的接头是红色的,这片红色在图中占的比例较大,而且比较方面寻找,所以可以先找一下这个红色的接头
在这里插入图片描述
找到之后,就能获取红色接头的位置,因为相机与接线的位置都是固定的,所以每次拍的照片都不会差太多,那么只要能找到这个红色接头,为它做一个外包矩形,根据矩形的中点,向右移动部分像素,这个要根据实际情况决定,然后大概得到一个范围,把六条线的位置可以剪切出来。
在这里插入图片描述
如图,切出这样一张图之后,就可以根据颜色来区分每条线是否接好以及位置是否正确。因为我们获取的像素范围是BGR的,所以需要自己计算成HSV的。

在这里插入图片描述
代码如下:

def rgb2hsv(r, g, b):
    r, g, b = r/255.0, g/255.0, b/255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    m = mx-mn
    if mx == mn:
        h = 0
    elif mx == r:
        if g >= b:
            h = ((g-b)/m)*60
        else:
            h = ((g-b)/m)*60 + 360
    elif mx == g:
        h = ((b-r)/m)*60 + 120
    elif mx == b:
        h = ((r-g)/m)*60 + 240
    if mx == 0:
        s = 0
    else:
        s = m/mx
    v = mx
    H = h / 2
    S = s * 255.0
    V = v * 255.0
    return H, S, V

得到了像素范围之后,就要去检测各个线的位置,以红色为例:

def redFind(image):
    lower = np.array([168, 43, 46])
    upper = np.array([180, 255, 255])
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    s = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    openI = cv2.morphologyEx(mask,cv2.MORPH_OPEN,s,iterations=1)
    closeI = cv2.morphologyEx(openI,cv2.MORPH_CLOSE,s,iterations=1)
    contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.minAreaRect(c)
        print("红色:", int((rect[0][1] + rect[1][1]/2)))

    cv2.imshow("aaa", closeI)
    cv2.waitKey(1000)

如图得到了红色电线的二值图像,通过最小外接矩形可以得到它的大概位置,如下图这是各个直线中点的纵向坐标。

附上代码:
Python代码:

import cv2 
import numpy as np 

def redFind(image):
    lower = np.array([168, 43, 46])
    upper = np.array([180, 255, 255])
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    s = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    openI = cv2.morphologyEx(mask,cv2.MORPH_OPEN,s,iterations=1)
    closeI = cv2.morphologyEx(openI,cv2.MORPH_CLOSE,s,iterations=1)
    contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.minAreaRect(c)
        print("红色:", int((rect[0][1] + rect[1][1]/2)))

    cv2.imshow("aaa", closeI)
    cv2.waitKey(1000)

def purpleFind(image):
    lower = np.array([142, 43, 46])
    upper = np.array([147, 255, 255])
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    s = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    openI = cv2.morphologyEx(mask,cv2.MORPH_OPEN,s,iterations=1)
    closeI = cv2.morphologyEx(openI,cv2.MORPH_CLOSE,s,iterations=1)
    contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.minAreaRect(c)
        print("紫色:", int((rect[0][1] + rect[1][1]/2)))

    cv2.imshow("aaa", closeI)
    cv2.waitKey(1000)

def blueFind(image):
    lower = np.array([102, 43, 46])
    upper = np.array([112, 255, 255])
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    s = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    openI = cv2.morphologyEx(mask,cv2.MORPH_OPEN,s,iterations=1)
    closeI = cv2.morphologyEx(openI,cv2.MORPH_CLOSE,s,iterations=1)
    contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.minAreaRect(c)
        print("蓝色:", int((rect[0][1] + rect[1][1]/2)))

    cv2.imshow("aaa", closeI)
    cv2.waitKey(1000)

def yellowFind(image):
    lower = np.array([20, 43, 46])
    upper = np.array([25, 255, 255])
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    s = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    openI = cv2.morphologyEx(mask,cv2.MORPH_OPEN,s,iterations=1)
    closeI = cv2.morphologyEx(openI,cv2.MORPH_CLOSE,s,iterations=1)
    contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.minAreaRect(c)
        print("黄色:", int((rect[0][1] + rect[1][1]/2)))

    cv2.imshow("aaa", closeI)
    cv2.waitKey(1000)

def orangeFind(image):
    lower = np.array([11, 43, 46])
    upper = np.array([15, 255, 255])
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    s = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
    openI = cv2.morphologyEx(mask,cv2.MORPH_OPEN,s,iterations=1)
    closeI = cv2.morphologyEx(openI,cv2.MORPH_CLOSE,s,iterations=1)
    contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.minAreaRect(c)
        print("橙色:", int((rect[0][1] + rect[1][1]/2)))

    cv2.imshow("aaa", closeI)
    cv2.waitKey(1000)

def brownFind(image):
    lower = np.array([3, 43, 46])
    upper = np.array([8, 255, 255])
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    s = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    openI = cv2.morphologyEx(mask,cv2.MORPH_OPEN,s,iterations=1)
    closeI = cv2.morphologyEx(openI,cv2.MORPH_CLOSE,s,iterations=1)
    contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.minAreaRect(c)
        print("棕色:", int((rect[0][1] + rect[1][1]/2)))

    cv2.imshow("aaa", closeI)
    cv2.waitKey(1000)

if __name__ == "__main__":
    image = cv2.imread("ceshi.png")
    purpleFind(image)
    orangeFind(image)
    yellowFind(image)
    brownFind(image)
    blueFind(image)
    redFind(image)

C++代码:
// coloranalyze.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <opencv2/core/core.hpp>              
#include <opencv2/highgui/highgui.hpp>              
#include <opencv2/imgproc/imgproc.hpp>  

using namespace std;
using namespace cv;

double purpleFind(Mat image);
double orangeFind(Mat image);
double yellowFind(Mat image);
double brownFind(Mat image);
double blueFind(Mat image);
double redFind(Mat image);

struct returnData
{
	double colorNumber[10];
	double line_y[10];
};

int main()
{
	Mat srcImage = imread("D:\\code\\code\\ceshi.png");
	Mat srcImage1;
	cvtColor(srcImage, srcImage1, COLOR_BGR2HSV);
	double y0, y1, y2, y3, y4, y5;
	returnData colorline;
	y0 = purpleFind(srcImage1);
	colorline.colorNumber[0] = 0;
	colorline.line_y[0] = y0;
	y1 = orangeFind(srcImage1);
	colorline.colorNumber[1] = 1;
	colorline.line_y[1] = y1;
	y2 = yellowFind(srcImage1);
	colorline.colorNumber[2] = 2;
	colorline.line_y[2] = y2;
	y3 = brownFind(srcImage1);
	colorline.colorNumber[3] = 3;
	colorline.line_y[3] = y3;
	y4 = blueFind(srcImage1);
	colorline.colorNumber[4] = 4;
	colorline.line_y[4] = y4;
	y5 = redFind(srcImage1);
	colorline.colorNumber[5] = 5;
	colorline.line_y[5] = y5;

	for (int i = 0; i < 6; i++) {
		cout << colorline.colorNumber[i] << endl;
		cout << colorline.line_y[i] << endl;

	}
	
	return 1;
	
}



double purpleFind(Mat image)
{
	Mat dstImage;
	inRange(image, Scalar(142, 43, 46), Scalar(147, 255, 255), dstImage);
	Mat s, openImage, closeImage;
	s = getStructuringElement(MORPH_RECT, Size(5, 5));
	morphologyEx(dstImage, openImage, MORPH_OPEN, s, Point(-1, -1), 1);
	morphologyEx(openImage, closeImage, MORPH_CLOSE, s, Point(-1, -1), 1);
	vector<vector<Point>> contours;
	findContours(closeImage, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
	Rect rect;
	rect = boundingRect(contours[0]);
	int line_y;
	line_y = rect.y + rect.height / 2;
	cout << line_y << endl;
	
	return line_y;
}

double orangeFind(Mat image)
{
	Mat dstImage;
	inRange(image, Scalar(11, 43, 46), Scalar(15, 255, 255), dstImage);
	Mat s, openImage, closeImage;
	s = getStructuringElement(MORPH_RECT, Size(7, 7));
	morphologyEx(dstImage, openImage, MORPH_OPEN, s, Point(-1, -1), 1);
	morphologyEx(openImage, closeImage, MORPH_CLOSE, s, Point(-1, -1), 1);
	vector<vector<Point>> contours;
	findContours(closeImage, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
	Rect rect;
	rect = boundingRect(contours[0]);
	int line_y;
	line_y = rect.y + rect.height / 2;
	cout << line_y << endl;
	return line_y;
}

double yellowFind(Mat image)
{
	Mat dstImage;
	inRange(image, Scalar(20, 43, 46), Scalar(25, 255, 255), dstImage);
	Mat s, openImage, closeImage;
	s = getStructuringElement(MORPH_RECT, Size(5, 5));
	morphologyEx(dstImage, openImage, MORPH_OPEN, s, Point(-1, -1), 1);
	morphologyEx(openImage, closeImage, MORPH_CLOSE, s, Point(-1, -1), 1);
	vector<vector<Point>> contours;
	findContours(closeImage, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
	Rect rect;
	rect = boundingRect(contours[0]);
	int line_y;
	line_y = rect.y + rect.height / 2;
	cout << line_y << endl;
	return line_y;
}

double brownFind(Mat image)
{
	Mat dstImage;
	inRange(image, Scalar(3, 43, 46), Scalar(8, 255, 255), dstImage);
	Mat s, openImage, closeImage;
	s = getStructuringElement(MORPH_RECT, Size(5, 5));
	morphologyEx(dstImage, openImage, MORPH_OPEN, s, Point(-1, -1), 1);
	morphologyEx(openImage, closeImage, MORPH_CLOSE, s, Point(-1, -1), 1);
	vector<vector<Point>> contours;
	findContours(closeImage, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
	Rect rect;
	rect = boundingRect(contours[0]);
	int line_y;
	line_y = rect.y + rect.height / 2;
	cout << line_y << endl;
	return line_y;
}

double blueFind(Mat image)
{
	Mat dstImage;
	inRange(image, Scalar(102, 43, 46), Scalar(112, 255, 255), dstImage);
	Mat s, openImage, closeImage;
	s = getStructuringElement(MORPH_RECT, Size(5, 5));
	morphologyEx(dstImage, openImage, MORPH_OPEN, s, Point(-1, -1), 1);
	morphologyEx(openImage, closeImage, MORPH_CLOSE, s, Point(-1, -1), 1);
	vector<vector<Point>> contours;
	findContours(closeImage, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
	Rect rect;
	rect = boundingRect(contours[0]);
	int line_y;
	line_y = rect.y + rect.height / 2;
	cout << line_y << endl;
	return line_y;
}

double redFind(Mat image)
{
	Mat dstImage;
	inRange(image, Scalar(168, 43, 46), Scalar(180, 255, 255), dstImage);
	Mat s, openImage, closeImage;
	s = getStructuringElement(MORPH_RECT, Size(5, 5));
	morphologyEx(dstImage, openImage, MORPH_OPEN, s, Point(-1, -1), 1);
	morphologyEx(openImage, closeImage, MORPH_CLOSE, s, Point(-1, -1), 1);
	vector<vector<Point>> contours;
	findContours(closeImage, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
	Rect rect;
	rect = boundingRect(contours[0]);
	int line_y;
	line_y = rect.y + rect.height / 2;
	cout << line_y << endl;

	return line_y;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv通过颜色区分电线 的相关文章

随机推荐

  • H.264码流分析仪

    目录 一 实验内容 二 实验结果 1 SPS profile idc level idc eq parameter set id log2 max frame num minus4 pic order cnt type log2 max p
  • @ApiModelProperty注解

    ApiModelProperty 用于方法 字段 表示对model属性的说明或者数据操作更改 value 字段说明 name 重写属性名字 dataType 重写属性类型 required 是否必填 example 举例说明 hidden
  • 电脑视频显示服务器运行失败,抖音直播伴侣提示:服务器终点无法运行操作或者创建视频源失败请重试解决方法视频教程...

    1 抖音直播伴侣多开 如果提示 服务器终点无法运行操作 或者创建视频源失败 请重试 多开插件一般是操作系统不兼容 要换操作系统 或者安装虚拟机 我推荐的操作系统是WIN10 64位 我拿了100多个操作系统测试 最终这个版本的稳定 可用 大
  • 图像分割套件PaddleSeg全面解析(四)数据预处理

    本部分主要介绍一下数据增强部分 PaddleSeg套件里把数据增强部分都定义在transforms里面 与Pytorch比较类似 这样就把一些基本的图像处理方法 缩放 归一化等 和数据增强 随机裁剪 翻转 颜色抖动 统一了 自己新增的数据增
  • 编程15年40岁程序员的我终于在压力下被迫转行了

    本人今年40岁多了 中山大学计算机小硕 已经从事it工作15年多 最后一次工作是2017年 创业 互联网教育方向 2020年失败关闭公司 创业失败后 在家沉淀了几个月 然后决定再次找工作 前几年频繁接到猎头电话的我 海投了不少公司 结果都渺
  • Linux网络协议栈

    TCP与UDP区别 区别一 是否基于连接 TCP是面向连接的协议 而UDP是无连接的协议 即TCP面向连接 UDP是无连接的 即发送数据之前不需要建立连接 区别二 可靠性 和 有序性 区别 TCP 提供交付保证 Tcp通过校验和 重传控制
  • mysql 控制每次批量插入5w条记录思路

    http blog csdn net jianjun4833 article details 71170113 由于业务中使用到word分词 所以数据量比较大 需要把分出来的结果插入到数据库 每次插入1条的话 非常慢 所以使用批量插入 具体
  • 【OpenCV】中copyto()函数的使用方法理解

    使用copyTo函数可以得到一个复制的矩阵 A copyTo B 就可以得到和A一模一样的矩阵B 当然需要事先声明B copyTo还有一个重构函数copyTo B MASK 意思是可以得到一个附加掩膜MASK的矩阵B 3 加载掩模 必须是灰
  • 有趣的python小程序-分贝测量

    声音是我们日常生活中非常重要的一种感官刺激 但长期受到高分贝噪音的干扰会对人体产生很大的伤害 因此 分贝 decibel dB 测量成为了一个重要的领域 其可以用来衡量声音的强度和能量 在本篇博客中 我们将介绍如何使用 Python 编写一
  • Mysql最常用时间格式转化

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 1 Date转字符串 2 字符串转Date 3 上述转化的字符串格式有许多种 常见的几种如下 总结 前言 主要介绍了Mysql中最常用的两个时间格式转化函数
  • 最简单的打印数组的方式

    注意 输出数组 不用 System out println arr toString System out println arr 以上两种方法输出的是数组的地址 下面这种方法输出的才是数组的内容 System out println Ar
  • 数据库课程设计 医院管理系统 SQL

    文章目录 一 背景资料 需求分析 二 功能模块 三 功能设计说明书 要求详细描述各模块功能 给出模块结构图 SC图 四 数据库设计 1 概念模型 图 2 逻辑模型 五 建表以及sql语句 1 病人表 2 医生表 3 科室表 4 病房表 六
  • JDBC连接Mysql长时间无动作连接失效

    错误场景介绍 做的有一个项目使用JDBC手动创建Connection实现了一个简单的自定义数据库连接池 用来支持Canal解析数据库Binlog指定业务库的插入修改SQL来进行数据库分表备份 按照月份 操作 但是发现当一个一段时间 较长 没
  • 零基础ros基于arduino键盘控制小车(2)

    1上传下位机程序 上传成功后 打开窗口监视器 输入m 20 20来进行测试 e键来检测编码器的值 r键复原 调试的过程在这里便不废话了 2上传上位机程序 2 1 见网上大多数是输入以下指令来查看当前可用窗口 ls dev tty 我是直接打
  • Error 11 No resource identifier found for attribute 'textAlignment' in package 'android' 问题解决

    遇到这个问题是因为最近在做融云及时通讯 当导入moudle后 在编译就出现了这个问题 刚开始在百度上搜 提示要把target api level 改为19 改完之后还是报同样的错误 然后就认为不是这个地方的原因 在别的地方找了好久也没找到
  • 【图文详解】入职必备——SVN使用教程

    一 SVN基本操作 1 进入svnbucket官网 创建一个空项目 学习svn 2 创建好测试项目后 复制对应地址 3 右键点击 SVN 检出 4 粘贴 版本库URL 填写 检出至目录 最后点击 确定 5 完善 用户名 和 密码 同svnb
  • SpringBoot系列--自定义Starter

    提到Spring Boot时 很多人想到的是它的自动化装配特性 当我们项目需要Redis MongoDB时 只需要引入相应的 spring boot starter data redis spring boot starter data m
  • log库spdlog简介及使用

    spdlog是一个开源的 快速的 仅有头文件的C 11 日志库 code地址在 https github com gabime spdlog 目前最新的发布版本为0 14 0 它提供了向流 标准输出 文件 系统日志 调试器等目标输出日志的能
  • 程序员常用在线工具网址

    online tools 1 字符串长度计算 https www toolbaba cn d dev str count 2 在线sha加密工具 http tools jb51 net password sha encode 3 在线进制转
  • Opencv通过颜色区分电线

    Opencv检测不同颜色的电线是否接好 机器视觉检测物体要根据检测对象的特征找到最方便快捷的方法 最近做了一个靠颜色像素来区分电线的小项目 颜色区分是inRange方法 这个方法检测的是HSV彩色图像的范围 需要将图像转换为HSV图像 如图