2017-12-07 7 views
1

PythonのOpenCVを使用して2つの画像で同様の詳細を検出するPythonプログラムを作成しようとしています。私は2つの画像を持っており、それらは現在のディレクトリにあり、存在しています(6-17行目のコードを参照)。しかし、私はそれを実行しようとすると、次のエラーが表示されます。ここで Python OpenCVエラー: "TypeError:画像データをfloatに変換できません"

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 

は、誰かが、なぜ私はそれが何を意味するのか、このエラーを取得しています私にexplpain、そしてどのようにしてくださいすることができます...私は得ることに保つエラーです修理する。

+0

私はあなたのエラーを再現できないので、原因と思われる私の答えを削除しました。 'isfile(path1)'をチェックして、実際に 'path1'を読んでいないのはなぜですか?画像の拡張子が違うのはなぜですか?どのバージョンのMPLを使用していますか? –

答えて

6

あなたは実際にイメージを読んでいません。

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が存在する場合は、チェックしている:

あなたはmatplotlibの中Noneを表示しようとすると何が起こるかをチェックしてください。さまざまな拡張機能に注意してください。なぜあなたはファイル名を2回(そして別々に)書くのですか?単に書く:matplotlibのは、それを描画しようとするまで、後続の関数のいずれかでエラーが呼び出しをしないあなたはcv2.imread()に偽のファイルを入れていても、結果として得られるイメージがちょうどNoneなること

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

注意を。あなたがprint(img1)を読んだ後にそれはNoneであり、正しく読まれていないことがわかります。

+0

良いキャッチ、あなたはおそらくこれをopencv-pythonで報告するべきです。 +1 – user1767754

+0

@ user1767754どういう意味ですか? 'opencv-python'はpipパッケージですが、これに関係なく' OpenCV'(またはここで例外を発行しているライブラリである 'matplotlib')に間違いがありません。これはユーザエラーです。 Pythonの実行モデルは、型、長さなどをチェックせず、ユーザーが望むことをやってみることです。 IMOのこの 'matplotlib'エラーは、Pythonが一般的にどのように実装されているかと非常に一致しています。例については、[this](https://stackoverflow.com/a/16138864/5087436)PythonのStackについての優れた答えを参照してください。 –

+0

コードを破損しにくく、デバッグしやすくする必要があります。コードが失敗すると、OpenCVのケースでは何がうまくいかなかったのかを知るはずです。私はそれがユーザーエラーではないと言っているわけではありませんが、エラーは誤解を招きます。 Pythonのオープンメソッド 'f = open( 'blub'、 'r')'も存在をチェックします。 – user1767754

関連する問題