fc2ブログ

OpenCVで直線を検出する

 久々にOpenCVを触る用事があり、直線検出の定番のHough変換を試してみました。昔々、画像処理をやっていた頃は「Blob検出」がほとんどだったので、Hough変換は使ったことがありませんでした。このサイトを参考にさせていただきました。ありがとうございました。

 テスト画像は適当にお絵描きして作成しました。test_image181030.png①直線、②一点鎖線と二点鎖線の混合、③点線、④二段の点線、⑤波線、⑥正方形、⑦四角形の切断片、⑧円、⑨楕円を描きました。どのようなものが直線として検出でき、どのようなものが検出できないのかを知りたかったからです。

 プログラムは、Pythonで簡便に書きました。C++よりも楽に確認できますね。
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.gray()

# Test Image Read
img = cv2.imread('test_image.png')
plt.imshow(img)
plt.show()

# Grayscale Processing
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray)
plt.show()

# Hough Transform
lines = cv2.HoughLines(gray, 1, np.pi/180, 100) # Threshold:100(Variable)

# Draw the lines and save the result image
for line in lines:
for rho, theta in line:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))

cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
cv2.imwrite('houghlines.png', img)

# Result file output
f = open('result.txt', 'a')
f.write(str(len(lines))+ '\n')
f.write(str(lines))
f.close()
 17行目のHough変換の関数HoughLinesの第1引数は入力画像、第2、3引数はそれぞれ「直線式 ρ=x・cosθ + y・sinθ」のρとθの精度で、4番目の引数が「直線とみなされるのに必要な最低限の投票数を意味するしきい値」とのこと。4番目の値を変えることで画像上のオブジェクトの直線検出の可否を評価しました。

 しきい値を変えた時の結果画像をgifファイルにしました。Hough181030.gifしきい値300では①直線のみが検出されました。その後、②一点鎖線と二点鎖線の混合が検出されました。直線が途切れていても直線として検出できるのですね。また、離れたオブジェクト(⑤、⑨)でも直線を引いてしまうようですね。③、④のように点線が検出できなかったのは、この図では「直線とみなされるのに必要な最低限の投票数」が足らなかったのでしょう。50まで行くと複数の直線が出てきて(円の接線を引いてしまうなどして)、収拾がつかなくなりました。

 実際の画像処理で直線検出を行うとなると、前処理でそれなりに明瞭に直線の要素を取り出す必要がありそうです。不明瞭な画像の場合は、条件出しも面倒そうですね。今回はこれ以上深くは突っ込まないつもりですが、大変勉強になりました。
スポンサーサイト



Raspberry PiでJupyter notebookを使う

 久々にRaspberry Piで遊んでみようと思い立ちました。というのも、Raspberry PiでJupyter notebookが使えるとの情報を見つけたからです。いまさらですね・・・。以前(2年ほど前?)、同じことを考えたのですが、その時はOSのRaspbianに対応していなかったのか?、すぐに諦めてしまいました。今回、Berrycondaというものをインストールすれば行けるとの記事を読んで、早速試してみました。

 githubのサイトから、利用しているRaspberry Pi2、Python3.6用のファイル(Berryconda3-2.0.0-Linux-armv7l.sh)をダウンロードしました。ダウンロードしたファイルについて、以下のコマンドで実行権限を付加してスタートです。
chmod +x Berryconda3-2.0.0-Linux-armv7l.sh
jupyter_setup1_1801020.png次に以下のコマンドでインストーラを実行します。
./Berryconda3-2.0.0-Linux-armv7l.sh
jupyter_setup2_1801020.pngそのまま実行し、完了するまで待ちます。jupyter_setup3_1801020.png インストール完了後、ターミナルから
jupyter notebook
を実行すると、無事に立ち上がりました。jupyter_notebook_20181020.png以前のblogで紹介したOpenCVのコードを実行してみると、jupyter_notebook_run_20181020.pngこれもまた問題なく動作しました。

 Raspberry Piは普通のパソコンに比べると力不足ですが、簡単なプログラムや長時間実行するようなプログラムには重宝かもしれません。また、遊んでみようと思います。

macOS Mojaveを入れる

 先日、メールでmacOSのアップグレードの案内が来ていました。現在自宅で利用しているPCは、主に家族が使っているWindows10デスクトップと、自分が使っているMacBook AirとHPノートの3台です。HPノートでWindows10を使っていた頃は、その遅さにしびれを切らして、しばしばMacに現実逃避していましたが、その問題のHPノートにUbuntuを入れてからは遅さも気にならなくなり、Macから遠ざかっていました。

 Macの機種は「11-inch, Early 2014」で高速SSDに交換したものですが、Windowsと違って、今まで躊躇なくアップグレードしてきました。購入時のOSが「OS X Yosemite」だったので、以後、OS X El Capitan、macOS Sierra、macOS High Sierra、今回のmacOS Mojaveと4回目のアップグレードになります。今回のアップグレードは2012年中期以降に発売されたMacBook Airモデルなら可能とのこと。名前のMojaveは、モハーヴェ砂漠(Mojave Desert)から来たものですね。高校時代の地理の授業で覚えた記憶が蘇ってきました。砂漠の名前は覚えていましたが、どこにある砂漠なのかはすっかり忘れていました(人の記憶ってそんなものですね)。

 ネットでインストーラを探して、いざインストールです。事前にタイムマシンでデータバックアップは忘れずに・・。Mojave_install.pngそのまま放置していたのですが、1時間弱でインストールできました。Mojave_label.png間違いなくアップグレードしていることを確認しました。

デスクトップの壁紙は砂丘でした。Mojave_Desktop.pngこのMojaveから「ダークモード」や「ダイナミックデスクトップ」が可能になったようです。刻々と壁紙の砂漠の様子が変わるようです。その他にも新機能があるようですが、まだ使い込めていません。ぼちぼちMacも嫌われない程度に?使っていこうと思います。

池井戸潤著『下町ロケット ヤタガラス』

 前作『下町ロケット ゴースト』を読んで、中途半端な終わり方に残念感をいだいたのは以前のブログでお話しました。続編の『下町ロケット ヤタガラス』がTV放送に合わせて出版されましたので、まんまと出版社とTV局の思惑に乗せられて購入し、読んでみました。 あまり詳しく話すとネタバレするので差し控えますが、読後の「もやもや感」は解消できましたが、「残念感」は拭い去れませんでした。

 読み進めるに連れて、次の展開や結末が読めてしまうんですね。素人である私でもストーリー展開が読めてしまうのは、いかがなものかと・・。TV用の脚本としてはストーリー展開が分かりやすく、好ましいのかもしれませんが、第一作のような逆境と順境が繰り返され、読者をスリリングにする点では第二作、三、四作に行くに従い、元来の池井戸スタイルが「退化」しているように思いました。

 また、技術屋として残念なことは、第一作に比べ、技術的な内容が激減していることです。第一作では技術面の内容まである程度突っ込んで書かれてあったので、それなりにリアリティを感じましたが、第三、四作では物足りなさを感じます。トランスミッションや自動操縦システムの何が問題なのか、それに対する佃製作所や競合メーカの苦労やブレークスルーが詳しく書かれておらず、表面的な記載で淡々とストーリー展開する点に残念感を拭えません。

 あくまでも個人の意見で、著者や作品を批難するものではありません。私自身の読書記録を調べてみると、『下町ロケット』の4作と『七つの会議』、『空飛ぶタイヤ』、『アキラとあきら』の7冊の池井戸作品を今まで読んでいました。ストーリー展開が読めてしまうのはそのせいかもしれませんが・・。

台風24号の気圧をウォッチする(3)

前回で話は完結しているのですが、今回は、前々回にお話した
  1. GIFファイルの作成手順
  2. Rを使った日本地図へのプロット
についての備忘録です。

1. GIFファイルの作成手順
① 画像の抽出、サイズ変更
 まず、iPadのハードコピー画像には余分な情報も含まれているので、必要な部分を抽出し、適正サイズに縮小しました。pic_IP_181008.png画像処理はOpenCVを使うことが多いのですが、簡単な画像操作はPythonのPIL(Python Image Library)でも十分でした。
from PIL import Image

for i in range(14):
input_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i+1) + '.PNG'
im_temp = Image.open(input_filename)

cropped_im_temp = im_temp.crop((50, 250, 1500, 1800))

width, height = cropped_im_temp.size
resized_im = cropped_im_temp.resize((int(width / 2.5), int(height / 2.5)))

output_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i+1) + '_res.PNG'
resized_im.save(output_filename)
4、5行目で目的の画像を読み込み、7行目で画像を抽出、9、10行目で画像をリサイズし、12、13行目で処理画像を保存しました。

② 画像上への文字入力
 次に、①で抽出、適正サイズにした個々の画像に文字を追加しました。
from PIL import Image, ImageDraw, ImageFont

i = 14
input_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i) + '_res.PNG'
im_temp = Image.open(input_filename)

draw = ImageDraw.Draw(im_temp)
font = ImageFont.truetype('/usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf', 27)
draw.text((10,10), '2018/10/01', fill ='red', font=font)
draw.text((10,50), '05:15', fill ='red', font=font)
draw.text((400,565), '989.71 [hPa]', fill ='red', font=font)

output_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i) + '.PNG'
im_temp.save(output_filename)
全くスマートではありませんが、14枚の画像について、手動バッチ式で処理しました。3〜5行目で①の画像を読み込み、7〜11行目で必要な情報を画像に書き込みました。13、14行目で処理画像を保存しました。

③ GIFファイル作成
 GIFファイルにする個々の画像を準備し、連番を付けておきます。その上で、ターミナルからconvertコマンドを実行するとGIFファイルが作成されます。GIFcreate_command.png
convert -delay 100 -dispose background *.PNG -loop 0 Atmospheric_pressure.gif
各引数の説明は以下の通りです。
 -delay : 画像の切り替わる時間(単位は1/100秒) ⇒ 1sec
 -dispose background : 現在のフレーム表示が終了したら、表示されていたエリアがクリアされる。
 *.PNG : 入力ファイル指定で、共通部分のみを入力して、変化する部分に * を入力
 -loop : ループする回数(0なら無限) ⇒ 無限繰り返し
 Atmospheric_pressure.gif : 出力ファイル名

コマンド実行で簡単にGIFファイルを作成できることがよく分かりました。

2. Rを使った日本地図へのプロット

 Rを使った日本地図へのプロットは、このサイト(Rで地図作成)を参考にさせていただきました。作成したRのコードは以下の通りです。
setwd('/home/drbobt/ドキュメント/R_code/ne_10m_land')
library(maptools) # maptools
world <- readShapePoly("ne_10m_land.shp") # shape File read

lonlim = c(125,145) # Longitude setting(E120〜150 degrees)
latlim = c(30,40) # Latitude setting(N30〜40 degrees)
plot(world, xlim=lonlim, ylim=latlim, axes=TRUE, xlab="Longitude", ylab="Latitude")

t_data <- read.csv('typhoon24.csv',header = TRUE) # Data read

for(i in 1:17){
points(as.numeric(t_data[i,5]), as.numeric(t_data[i,4]), pch=1) # Plot
text(as.numeric(t_data[i,5])+0.25, as.numeric(t_data[i,4])-0.25, labels=substr(t_data[i,2], 1, 2), cex=1.0) # Hour add
if(i<17){ # Line
segments(as.numeric(t_data[i,5]), as.numeric(t_data[i,4]),as.numeric(t_data[i+1,5]), as.numeric(t_data[i+1,4]),col = 'red', lwd = 3)
}
}
データファイルは以下の通りです。3列目は気象台の気圧、4列目は緯度、5列目は経度、最終列(6列目)は台風の中心気圧です。台風の位置情報はネット上のサイトから取得しました。
Date,Time,Pressure,latitude(N),longitude(E),Center
2018/09/30,13:00,1000.6,32.00,132.30,950
2018/09/30,14:00,998.2,32.10,133.05,950
2018/09/30,15:00,995.6,32.35,133.20,950
2018/09/30,16:00,993.5,33.00,133.55,950
2018/09/30,17:00,990.3,33.05,134.30,950
2018/09/30,18:00,986.8,33.40,134.55,950
2018/09/30,19:00,982.1,33.40,135.10,950
2018/09/30,20:00,978.7,34.10,135.55,950
2018/09/30,21:00,974.9,34.40,136.30,960
2018/09/30,22:00,972.6,35.10,136.55,965
2018/09/30,23:00,975.3,35.35,137.20,965
2018/10/01,00:00,980.9,36.05,138.00,970
2018/10/01,01:00,989.1,36.30,139.00,970
2018/10/01,02:00,993.8,37.35,139.35,970
2018/10/01,03:00,997.5,37.50,140.05,970
2018/10/01,04:00,999.3,38.30,140.50,970
2018/10/01,05:00,1000.1,39.25,141.55,970
 地図を利用した「データの見える化」もRを利用すると簡単にできることが分かりました。何か使えそうな案件があれば、使っていきたいと思います。

台風24号の気圧をウォッチする(2)

 前回の続きです。気象台の気圧データとiPadの計測データの差の10hPaですが、結論から言うと「標高差」によるものであることが分かりました。
 初めは使用しているアプリが測定値に補正をかけているのかなと思っていました。そこで、Apple Storeにある別のFreeの気圧計のアプリを2種類試してみました。check_app181018.png前回使った「気圧計」のほかに、「バロメーター」と「Barometer」を試してみました。漢字、カタカナ、英語の表記違いはありますが、結局すべて同じ名前ですね・・・。この3種類のアプリで1分以内に計測した気圧結果は1004.9hPaで同じでした。アプリの違いではないようです。

 その後、気象庁のホームページを確認していると、以下の表示がありました。atmospheric_pressure_definition.pngなるほど、これが原因だなと思い、自宅の標高を「地理院地図」で調べてみました。結果、自宅は標高(海抜)106mでした。初めて知りました・・・。

 次に、この106mで気圧の差がどれほど生じるかを、このサイトで調べてみました。以下のデータを入力し、計算を押しました。
 ① 自宅のiPadの気圧測定データ
 ② 自宅の気温
 ③ 気象台の気圧データatmospheric_pressure_calc.png結果、計算値は標高95.41mでした。実際と約10mの誤差はありましたが、概ね反映できていると考えました。つまり、iPadの気圧計は、その計測地点の気圧を正しく測定できていると判断し、気象台の気圧とのズレについても理解しました。
 今回も、大変勉強になりました。

台風24号の気圧をウォッチする(1)

 今年は台風の当たり年なのか、今住んでいる関西にも数回(12、21、24号)上陸しては通過していきました。その中でも、9/4(火)午後に関西を通過した「台風21号」は今まで私が経験した中で一番強力なものでした。当日は関西圏内のJRが全線不通だったので、会社に行けずに自宅待機でした・・。
 昔々(小学校に入る前:70年代・・歳が分かってしまいますね・・)、九州の実家にいた頃は、頻繁に台風が来ていたように記憶しています。家の屋根瓦が飛んだり、雨漏りしたり、家のすぐそばを流れる川が増水するなどなど。幼心に怖い思いをしたので、未だに恐ろしく感じます。

 その強力な21号から1ヶ月も経っていないのに、台風24号が9/30(日)夜〜10/1(月)未明に関西を通過しました。この時、何気なく、気圧の変化を測定してみようと思い立ちました。台風の時って、特に何もすることがないんですよね・・。
 まず、思いついたのは以前のブログでお話したボッシュ製のBME280を搭載した温湿度、気圧モジュールを使った方法です。Raspberry Piでデータロギングしようかなと思いながら久々に触ると、昔つくったソフトを探し出せずに断念(台風が近づいているので諦めも肝心・・)。

 次に、iPadに気圧計が付いていたことを思い出し、アプリをダウンロードし、早速使ってみました。「気圧計」というその名の通りのアプリです。
 飛び飛びのデータですが、9/30 20:00〜10/1 5:15の気圧の変化です。Typhoon24_Pressure.gif9/30の22時頃の気圧が一番低く、台風が接近していることが分かりました。
 このgifファイルは、iPad画面のハードコピーから必要な部分をPythonの簡単なコードで切り抜き、文字を記入して、最終的にgifファイルを作成しましたが、この方法の詳細はまたの機会にお話します(ブログ件数稼ぎ?)。

 台風進路の緯度経度データをネット上で採取し、Rを使って日本地図に描画させました。こんな感じです。Typhoon24_map.png確かに21〜22時頃に台風が関西を通過して行ったことが分かります。このRで地図を利用する件も、別の機会にお話します。Rって、こんなこともできるんだと改めて感心しました。

 自宅の近くの気象台の1時間毎の気圧データと、iPadで計測されたデータを比較プロットすると、以下の通りです。Typhoon24_Graph.pngiPadのデータは気象台のデータに比べて、10hPa程度小さめに出ていますが、オフセットは一定で変化の傾向は捉えられています。このズレについてお話したいところですが、長くなりましたので、次回お話します。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: