Python OpenCV 错误 : "TypeError: Image data cannot be converted to float"

标签 python opencv

所以我正在尝试创建一个 Python 程序来使用 Python 的 OpenCV 检测两个图像中的相似细节。我有两个图像,它们在我的当前目录中,并且它们存在(请参阅第 6-17 行中的代码)。但是当我尝试运行它时出现以下错误。

import numpy as np
import matplotlib.pyplot as plt
import cv2
import os

path1 = "WIN_20171207_13_51_33_Pro.jpg"
path2 = "WIN_20171207_13_51_43_Pro.jpg"

if os.path.isfile(path1):
    img1 = cv2.imread('WIN_20171207_13_51_33_Pro.jpeg',0)
else:
    print ("The file " + path1 + " does not exist.")

if os.path.isfile(path2):
    img2 = cv2.imread('WIN_20171207_13_51_43_Pro.jpeg',0)
else:
    print ("The file " + path2 + " does not exist.")

orb = cv2.ORB_create()

kpl1, des1 = orb.detectAndCompute(img1,None)
kpl2, des2 = orb.detectAndCompute(img2,None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x:x.distance)

img3 = cv2.drawMatches(img1,kpl1,img2,kpl2,matches[:10],None, flags=2)

plt.imshow (img3)
plt.show()

这是我不断收到的错误...

Traceback (most recent call last):


File "C:\Users\jweir\source\repos\BruteForceFeatureDetection\BruteForceFeatureDetection\BruteForceFeatureDetection.py", line 31, in <module>
    plt.imshow (img3)
  File "C:\Program Files\Python36\lib\site-packages\matplotlib\pyplot.py", line 3080, in imshow
    **kwargs)
  File "C:\Program Files\Python36\lib\site-packages\matplotlib\__init__.py", line 1710, in inner
    return func(ax, *args, **kwargs)
  File "C:\Program Files\Python36\lib\site-packages\matplotlib\axes\_axes.py", line 5194, in imshow
    im.set_data(X)
  File "C:\Program Files\Python36\lib\site-packages\matplotlib\image.py", line 600, in set_data
    raise TypeError("Image data cannot be converted to float")
TypeError: Image data cannot be converted to float

有人可以向我解释为什么会出现此错误、它意味着什么以及如何解决它。

最佳答案

您实际上并不是在读图像。

看看如果您尝试在 matplotlib 中显示 None 会发生什么:

plt.imshow(None)
Traceback (most recent call last):  

 File ".../example.py", line 16, in <module>  
   plt.imshow(None)  
 File ".../matplotlib/pyplot.py", line 3157, in imshow  
   **kwargs)  
 File ".../matplotlib/__init__.py", line 1898, in inner  
   return func(ax, *args, **kwargs)  
 File ".../matplotlib/axes/_axes.py", line 5124, in imshow  
   im.set_data(X)  
 File ".../matplotlib/image.py", line 596, in set_data  
   raise TypeError("Image data can not convert to float")  

TypeError: Image data can not convert to float  

您正在阅读 WIN_20171207_13_51_33_Pro.jpeg 但您正在检查 WIN_20171207_13_51_33_Pro.jpg 是否存在。注意不同的扩展名。为什么你的文件名写了两次(而且是不同的)?只需简单地写:

if os.path.isfile(path1):
    img1 = cv2.imread(path1, 0)
else:
    print ("The file " + path1 + " does not exist.")

请注意,即使您将伪造的文件放入 cv2.imread(),生成的图像也只会是 None,这不会在任何随后的函数调用,直到 matplotlib 尝试绘制它。如果您在阅读后print(img1),您会看到它是None,并且没有正确阅读。

关于Python OpenCV 错误 : "TypeError: Image data cannot be converted to float",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47704895/

相关文章:

c++ - 使用 Contour Area-OpenCV 时的断言错误

python - 奇怪……[::5,0]是什么意思

python - "' str ' object has no attribute ' 在使用 Google Cloud Storage 和 ScrapingHub 时获取 '"

python - seaborn distplot 的权重选项?

python - 在 Python 中重现 MATLAB 的 imgaborfilt

java - 为什么 Opencv Imgproc.minAreaRect 以不同的顺序对相同的点(构成不对称三角形)给出不同的结果?

python - pip freeze 不依赖已安装的包

python - os.getcwd() 和 os.path.dirname(__file__) 的区别

c++ - Glibcxx 错误编译 FREAK OpenCV 演示文件

image - 检测图像中的小点