2021年2月7日日曜日

PyLSD 0.0.2 の修正 on Python 3.9.1

 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という新しいバージョンが出てた.

ocrd-fork-pylsd 0.0.3

pip3 install orcd-fork-pylsdとすると,ちゃんとPython3の場合には上記のファイル名の変更が反映されている.しかし,このページの中身が更新されていないので,pip3 install pylsdとすると,変更が反映されない.

0 件のコメント:

コメントを投稿