質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

4126閲覧

引用元のプログラムが動かない

my_yuu

総合スコア10

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/10 16:43

編集2019/01/11 05:55

引用元のプログラムがそもそも動かない

こちらのサイトのプログラムを実際に動かしてみたところ、途中で処理が止まっているようです。エラーメッセージを読んで調べてみましたが解決方法が分かりません。調べた際に見つけたサイトを「試してみたこと」の部分にリンクを貼っています。ソートが上手く出来ていないようです。

発生している問題・エラーメッセージ

gazou.jpg_gray.jpgとgazou.jpg_th.jpgを保存するところまでは動いています。

gazou.jpg_gray.jpg gazou.jpg_th.jpg Traceback (most recent call last): File "big_square3.py", line 102, in <module> convert("gazou.jpg") File "big_square3.py", line 58, in convert cnts.sort(key=cv2.contourArea, reverse=True) # 面積が大きい順に並べ替える。 TypeError: 'reverse' is an invalid keyword argument for this function

該当のソースコード

python

1#!/usr/bin/env python 2# coding:utf-8 3#引用元WEBサイト 4#http://miettal.hatenablog.com/entry/2015/12/31/020434 5 6# convert.py 7# 8# Author: Hiromasa Ihara (taisyo) 9# Created: 2015-10-04 10# 11 12#sudo apt-get update 13#sudo apt-get install python-opencv 14#sudo apt-get install tesseract-ocr 15#sudo apt-get install tesseract-ocr-jpn 16 17import numpy 18import os 19import cv2 20 21def transform_by4(img, points): 22 """ 4点を指定してトリミングする。 23 source:http://blanktar.jp/blog/2015/07/python-opencv-crop-box.html 24 """ 25 26 points = sorted(points, key=lambda x:x[1]) # yが小さいもの順に並び替え。 27 top = sorted(points[:2], key=lambda x:x[0]) # 前半二つは四角形の上。xで並び替えると左右も分かる。 28 bottom = sorted(points[2:], key=lambda x:x[0], reverse=True) # 後半二つは四角形の下。同じくxで並び替え。 29 points = numpy.array(top + bottom, dtype='float32') # 分離した二つを再結合。 30 31 width = max(numpy.sqrt(((points[0][0]-points[2][0])**2)*2), numpy.sqrt(((points[1][0]-points[3][0])**2)*2)) 32 height = max(numpy.sqrt(((points[0][1]-points[2][1])**2)*2), numpy.sqrt(((points[1][1]-points[3][1])**2)*2)) 33 34 dst = numpy.array([ 35 numpy.array([0, 0]), 36 numpy.array([width-1, 0]), 37 numpy.array([width-1, height-1]), 38 numpy.array([0, height-1]), 39 ], numpy.float32) 40 41 trans = cv2.getPerspectiveTransform(points, dst) # 変換前の座標と変換後の座標の対応を渡すと、透視変換行列を作ってくれる。 42 return cv2.warpPerspective(img, trans, (int(width), int(height))) # 透視変換行列を使って切り抜く。 43 44def convert(filename) : 45 im = cv2.imread(filename) 46 47#グレースケール化 48 im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 49 cv2.imwrite(filename+'_gray.jpg', im_gray) 50 print filename+'_gray.jpg' 51 52 im_blur = cv2.fastNlMeansDenoising(im_gray) 53 im_th = cv2.adaptiveThreshold(im_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, 5) 54 th_filename = "{:s}_th.jpg".format(filename) 55 cv2.imwrite(th_filename, im_th) 56 print filename+'_th.jpg' 57# coding:utf-8 58# 59 60#輪郭抽出 61 cnts = cv2.findContours(im_th, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0] # 抽出した輪郭に近似する直線(?)を探す。 62 cnts.sort(key=cv2.contourArea, reverse=True) # 面積(cv2.contourArea)が大きい順に並べ替える。 63 64 im_line = im.copy() 65 warp = None 66 for c in cnts[1:]: 67 arclen = cv2.arcLength(c, True) 68 approx = cv2.approxPolyDP(c, 0.02*arclen, True) 69 70 if len(approx) == 4: 71 cv2.drawContours(im_line, [approx], -1, (0, 0, 255), 2) 72 if warp == None: 73 print approx 74 warp = approx.copy() # 一番面積の大きな四角形をwarpに保存。 75 else: 76 cv2.drawContours(im_line, [approx]!/usr/bin/env python 77# coding:utf-8 78#, -1, (0, 255, 0), 2) 79 80 for pos in approx: 81 cv2.circle(im_line, tuple(pos[0]), 4, (255, 0, 0)) 82 83 cv2.imshow('im_line', im_line) 84 cv2.imwrite(filename+'_line.jpg', im_line) 85 print filename+'_line.jpg' 86 87 im_rect = transform_by4(im, warp[:,0,:]) 88 cv2.imwrite(filename+'_rect.jpg', im_rect) 89 print filename+'_rect.jpg' 90 91#グレースケール化 92 im_rect_gray = cv2.cvtColor(im_rect, cv2.COLOR_BGR2GRAY) 93 cv2.imwrite(filename+'_rect_gray.jpg', im_rect_gray) 94 print filename+'_rect_gray.jpg' 95 96 im_rect_blur = cv2.fastNlMeansDenoising(im_rect_gray) 97 im_rect_th = cv2.adaptiveThreshold(im_rect_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 63, 5) 98 rect_th_filename = "{:s}_rect_th.jpg".format(filename) 99 cv2.imwrite(rect_th_filename, im_rect_th) 100 print filename+'_rect_th.jpg' 101 102 rect_th_filename = "{:s}_rect_th.jpg".format(filename) 103 os.system("tesseract {:s} out -l jpn".format(rect_th_filename)) 104 text = open("out.txt").read().replace('ー', '1').replace('\', '¥') 105 print text 106 107if __name__ == '__main__': 108 convert("gazou.jpg")

試したこと

調べてみたところ、こちらのサイトに記載されている問題と同じ感じがしたので解決策見てみたのですがどうすればいいのかよく分かりませんでした。

補足情報(FW/ツールのバージョンなど)

環境は以下の通りです。

OpenCV(3.4.3)
Python 2.7.12
ubuntu 16.04.5

2019/01/11追記
読み込ませる画像によってエラー文が変わりました。
画像によってはグレースケールを行う段階でエラーが出たりすることもあるようです。
質問の部分より前の部分でエラーが出る場合は画像を変えて再実行してみてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/01/11 00:10

58行目「print filename+'_th.jpg'!/usr/bin/env python」でSyntaxErrorが発生します。 動作するようにソースコードを修正ください。
my_yuu

2019/01/11 05:37 編集

すみません。「!/usr/bin/env python」の部分はいらないので消してください。
guest

回答1

0

こんにちは。

こちらのサイトに記載されている問題と同じ感じがした

いいところまでいってますね。
NumPyの新しいバージョンでは key, reverse というパラメータはなくなりました。
key は order を使って代用し、reverse はスライス[::-1]で逆順にしましょう。
参考:NumPyの使い方(9) 並べ替えsortなど - Remrinのpython攻略日記

あるいは古いNumPyを使うという手もあります。

投稿2019/01/11 00:11

編集2019/01/11 00:12
firedfly

総合スコア1131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問