Pythonで画像から直線を抽出する場合,Hough変換よりLSD(Line Segment Detector)を実装したpylsdの方が速くて精度が良いという話を見た.
pythonの直線検出は間違いなくOpenCVではなくPylsdが優れている
現在,python3.9.1でpylsdがpip3からインストールできるが,動かないので修正した.致命的なのは,テンポラリファイルのファイル名の文字列をPythonからCのライブラリに渡す所だった.パッチファイルを以下に掲載する.
diff -ru pylsd.old/__init__.py pylsd/__init__.py --- pylsd.old/__init__.py 2021-02-07 23:07:21.000000000 +0900 +++ pylsd/__init__.py 2021-02-07 23:12:42.000000000 +0900 @@ -5,4 +5,4 @@ # @Link : https://github.com/primetang/pylsd # @Version : 0.0.1 -from lsd import lsd +from . import lsd diff -ru pylsd.old/bindings/__init__.py pylsd/bindings/__init__.py --- pylsd.old/bindings/__init__.py 2021-02-07 23:07:21.000000000 +0900 +++ pylsd/bindings/__init__.py 2021-02-07 23:13:37.000000000 +0900 @@ -5,4 +5,4 @@ # @Link : https://github.com/primetang/pylsd # @Version : 0.0.1 -from lsd_ctypes import * +from .lsd_ctypes import * diff -ru pylsd.old/bindings/lsd_ctypes.py pylsd/bindings/lsd_ctypes.py --- pylsd.old/bindings/lsd_ctypes.py 2021-02-07 23:07:21.000000000 +0900 +++ pylsd/bindings/lsd_ctypes.py 2021-02-07 23:14:03.000000000 +0900 @@ -31,7 +31,7 @@ try: lsdlib = ctypes.cdll[os.path.join(root_dir, libdir, libname)] return lsdlib - except Exception, e: + except Exception as e: pass tmp = os.path.dirname(root_dir) if tmp == root_dir: diff -ru pylsd.old/lsd.py pylsd/lsd.py --- pylsd.old/lsd.py 2021-02-07 23:07:21.000000000 +0900 +++ pylsd/lsd.py 2021-02-07 23:13:19.000000000 +0900 @@ -5,7 +5,7 @@ # @Link : https://github.com/primetang/pylsd # @Version : 0.0.1 -from bindings.lsd_ctypes import * +from .bindings.lsd_ctypes import * def lsd(src): @@ -17,7 +17,11 @@ lens = len(src) src = (ctypes.c_double * lens)(*src) - lsdlib.lsdGet(src, ctypes.c_int(rows), ctypes.c_int(cols), temp) + #lsdlib.lsdGet(src, ctypes.c_int(rows), ctypes.c_int(cols), temp) + enc_temp = temp.encode('utf-8') + cstr_temp = ctypes.create_string_buffer(enc_temp) + lsdlib.lsdGet(src, ctypes.c_int(rows), ctypes.c_int(cols), cstr_temp) + fp = open(temp, 'r') cnt = fp.read().strip().split(' ')
pip3 install pylsdした後で,上記のファイルをdiff.txtというファイルに保存し,pylsdのインストールされているディレクトリの中(python3をbrewでインストールしている場合は/usr/local/lib/python3.9/site_packages/pylsd)の中でpatch -p1 -u < diff.txtすれば良い.
追記: pylsd 0.0.3という新しいバージョンが出てた.
pip3 install orcd-fork-pylsdとすると,ちゃんとPython3の場合には上記のファイル名の変更が反映されている.しかし,このページの中身が更新されていないので,pip3 install pylsdとすると,変更が反映されない.