【问题标题】:openCV don't render my draw, just a simple black windowopenCV不渲染我的画,只是一个简单的黑色窗口
【发布时间】:2021-01-07 21:03:58
【问题描述】:

我只是写了一个简单的代码来当我点击时画一个圆圈,但我只看到一个黑色的图像而不是我的圆圈

import cv2
import numpy as np

def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img,(x,y),100,(255,0,0),-1)

cv2.namedWindow(winname='my_drawing')
cv2.setMouseCallback('my_drawing', draw_circle)
img = np.zeros((512, 512, 3), np.int32)
while True:
    cv2.imshow('my_drawing', img)
    if cv2.waitKey(0) == 27:
        break

cv2.destroyAllWindows()

有人可以帮我吗?我的 IDE 是 Pycharm

编辑:

我解决了这个问题,但我不知道为什么会这样。我将 np.int32 更改为 np.uint8 并更改了此功能:

def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img,(x,y),100,(255,0,0),-1)
        cv2.imshow('my_drawing', img)
        cv2.waitKey(0)

为什么我需要使用 .imshow() 2 次?为什么我需要使用 np.uint8?

【问题讨论】:

  • 这是什么意思:“imshow() 2 次”?
  • 您需要一个额外的cv2.imshow() 才能显示更新的图像。
  • @barny hummm okkk 就是这样。我以为我只需要一个,因为我在 jupyter 上看到了一些视频,它们只是在 .imshow() 上使用

标签: python opencv


【解决方案1】:

问:为什么我需要使用 np.uint8?

A:一个像素通常存储为 3 个字节的集合,每种颜色(RGB)各有 1 个字节。在这种情况下,一个 np.uint8 相当于一个字节。 np.uint32 为 4 字节,太大而无法用作颜色值。

“当前典型的显示适配器为每个像素使用最多 24 位信息:每个组件 8 位乘以三个组件(请参阅下面的数字表示部分(24 位 = 2563,每个主值 8 位,值为0–255)" --https://en.wikipedia.org/wiki/RGB_color_model

【讨论】:

    【解决方案2】:

    您需要将您的图片类型声明为uint8

    img = np.zeros(shape=(512, 512, 3), dtype=np.uint8)
    

    来自answers.opencv.orgscikit-image

    Uint8之所以很常见,是因为它是标准的图像显示方式,每个像素的范围在0到255之间。如果是灰度图像,值为0的像素为黑色,值为0的像素为黑色。值 255 为白色,中间为灰色

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多