【问题标题】:Unable to load image into window using cv2.Imshow无法使用 cv2.Imshow 将图像加载到窗口中
【发布时间】:2019-06-24 23:44:13
【问题描述】:

我一直在尝试按照tutorial on youtube 生成 OCR 工具,并使用以下脚本:

import os
import sys

import cv2
import numpy as np

input_f = 'letter.data'

img_resize_factor = 12
start, end = 6, -1
height, width = 16, 8

with open(input_f, 'r') as f:
    for line in f.readlines():
        data = np.array([255*float(x) for x in line.split('\t')[start:end]])
        img = np.reshape(data, (height, width))
        img_scaled = cv2.resize(img, None, fx=img_resize_factor, fy=img_resize_factor)
        print(line)
        cv2.imshow('img', img_scaled)

        c = cv2.waitKey()
        if c == 27:
            break

代码在尝试使用cv2.imshow('img', img_scaled) 时发生故障,但出现窗口无响应且图像未加载到其中。

我正在使用最新版本的 OpenCV,我在 VisualStudio 中运行它,并且必须将 "python.linting.pylintArgs": ["--extension-pkg-whitelist=cv2"] 添加到用户设置中。

我得到的错误是:

发生异常:cv2.error OpenCV(4.0.0) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:261: 错误:(-2:未指定的错误)在函数'__cdecl cv::CvtHelper,struct cv::Set,struct cv::Set,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)' > 不支持的输入图像深度:>
'VDepth::contains(depth)' > where > 'depth' is 6 (CV_64F) 文件 “C:\Users\aofarrell\Desktop\Python\NeuralNetworks\SimpleOCR.py”,行 23,在 打破

【问题讨论】:

  • @Miki 你没看错吗?对我来说,它看起来更像单通道,基于创建它的代码,但数据类型为 64 位浮点数(因为 OP 在创建数组时从不指定数据类型)。 (消息还明确提到了CV_64F...如果这是一个频道计数,不知道为什么会这样说。)
  • 由于您在创建 numpy 数组时未指定数据类型,因此将其创建为 np.float64。 OpenCV 似乎不喜欢那样。选择 OpenCV 支持的适当数据类型(这里可能 np.uint8 就足够了,或者可能是 np.float32),然后在创建数组时指定它,或者添加一个演员表。

标签: python opencv opencv3.0 cv2


【解决方案1】:

您的脚本中的所有内容都是错误的。

解决方案

1)如果你正在打开一个文件,只打开一个文件,获取数据并退出with语句

2)您遇到的错误是由于形状错误

我打开文件并提取图像

import os
import sys
import cv2
import numpy as np

input_f = 'letter.data'
start, end = 6, -1



def file_opener(input_f):
    with open(input_f,'r') as fl:
        for line in fl.readlines():
            yield np.array([255*float(x) for x in line.split('\t')[start:-1]])

iterator = file_opener(input_f)
images = np.array([row for row in iterator]).reshape(52152,16,8)  # array with 52152 images


for image_index in range(images.shape[0]):
    IMAGE = cv2.resize(images[image_index,:],(0,0),fx=5,fy=5)
    cv2.imshow('image {}/{}'.format(image_index,images.shape[0]),IMAGE)
    cv2.waitKey(0)
cv2.destroyAllWindows(0)

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 2018-04-24
    • 2021-05-29
    • 2020-08-04
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多