使用Open CV获取轮廓内的平均颜色-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

使用Open CV获取轮廓内的平均颜色

2019-01-23 15:18:18 3888 1

我的第一个项目是在相对静止的背景上检测移动物体,然后检测它们的平均颜色以对它们进行分类。至少有10个对象需要检测,我正在处理彩色视频。

到目前为止,我设法删除背景,识别轮廓(可选地获得每个轮廓的中心),但现在我正在努力获得每个轮廓内的平均或平均颜色。有一些关于这类问题的主题,但大多数是用C语言写的。显然我可以使用cv.mean()但是我无法获得一个工作掩码来提供这个功能。

import numpy as np
import cv2

video_path = 'test.h264'

cap = cv2.VideoCapture(video_path)
fgbg = cv2.createBackgroundSubtractorMOG2()

while (cap.isOpened):

ret, frame = cap.read()
if ret==True:
    fgmask = fgbg.apply(frame)
    (contours, hierarchy) = cv2.findContours(fgmask, cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

    for c in contours:
        if cv2.contourArea(c) > 2000:
            cv2.drawContours(frame, c, -1, (255,0,0), 3)
    cv2.imshow('foreground and background',fgmask)
    cv2.imshow('rgb',frame)

key = cv2.waitKey(1) & 0xFF

if key == ord("q"):
    break

cap.release()
cv2.destroyAllWindows()

取消 提交回答
全部回答(1)
  • 一码平川MACHEL
    2019-07-17 23:26:40

    您可以通过首先创建与输入图像尺寸相同且像素值设置为零的新图像来创建mask。

    然后使用像素值255将轮廓绘制到此图像上。生成的图像可用作mask。

    mask = np.zeros(frame.shape, np.uint8)
    cv2.drawContours(mask, c, -1, 255, -1)
    然后,mask可以用作cv.mean之类的参数

    mean = cv.mean(frame, mask=mask)
    只需提醒一句,RGB颜色的平均值并不总是有意义的。也许尝试转换为HSV色彩空间,并仅使用H通道检测对象的颜色。


    图像上的解决方案

    1)找到轮廓(在这种情况下是矩形,非矩形的轮廓更难制作)

    2)找到轮廓的坐标

    3)从轮廓切割图像

    4)对各个通道求和并将其除以其中的像素数(或平均函数)

    import numpy as np
    import cv2
    img = cv2.imread('my_image.jpg',1)
    cp = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret,thresh = cv2.threshold(cp,150,255,0)
    cv2.imshow('img',thresh)
    cv2.waitKey(0)
    im2,contours,hierarchy = cv2.findContours(thresh.astype(np.uint8), 1, 2)
    cnts = contours
    for cnt in cnts:

    if cv2.contourArea(cnt) >800: # filter small contours
        x,y,w,h = cv2.boundingRect(cnt) # offsets - with this you get 'mask'
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
        cv2.imshow('cutted contour',img[y:y+h,x:x+w])
        print('Average color (BGR): ',np.array(cv2.mean(img[y:y+h,x:x+w])).astype(np.uint8))
        cv2.waitKey(0)

    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    要消除噪音,您可以只取轮廓的中心,并采用较小的矩形进行检查。

    0 0
相关问答

1

回答

PyODPS DataFrame的计算原理是什么?

2021-12-13 23:03:51 368浏览量 回答数 1

1

回答

PyODPS DataFrame支持的数据类型有什么?

2021-12-11 15:44:11 472浏览量 回答数 1

1

回答

如何计算分组dataframe的平均值,并将分组列保留为另一列?

2021-12-05 20:39:19 184浏览量 回答数 1

1

回答

如何归一化dataframe的所有列?

2021-12-05 20:33:47 156浏览量 回答数 1

1

回答

pandas DataFrame中如何获取某一列的值?

2021-11-29 20:09:46 80浏览量 回答数 1

1

回答

如何使用 Docker 在 VPC 内的 ECS 上安装 OpenVPN 服务器?

2020-03-28 22:51:16 1325浏览量 回答数 1

2

回答

如何计算和获取Spark Dataframe中唯一ID的值总和?

2019-01-02 15:21:10 4075浏览量 回答数 2

2

回答

css中rem是什么意思

2018-05-10 20:05:55 4917浏览量 回答数 2

1

回答

已有的泛微OA可以和钉钉建立连接吗

2016-05-23 09:50:40 5362浏览量 回答数 1

1

回答

安卓 gps获取坐标测速不准确,主要问题在哪里?

2016-03-03 14:52:50 3104浏览量 回答数 1
47
文章
723
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载