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とすると,変更が反映されない.
0 件のコメント:
コメントを投稿