ソフトウエア Archive
PythonとOpenCVによる画像処理プログラミングセミナー 第1回目
■はじめに
私はハードウェアグループ所属で、プログラミング業務に携わることが少なかったのですが、
画像処理プログラミングについて先輩から教わる機会を設けることができました。
ここでは、プログラミング入門者である私が、日々学んだ技術を紹介していきたいと思います。
■今回のテーマ
まずはIntel社の画像処理ライブラリOpenCVを使った画像処理プログラムについて紹介します。
OpenCVは、500以上もの関数が用意され、座標変換、特徴点抽出といった画像処理が容易に行えます。
OpenCVはC言語用のライブラリですが、今回はコンパイル不要でデバッグがスムーズに行える
スクリプト言語python、OpenCVをpythonで使用するためのctypes OpenCVモジュールを使った
画像処理について、紹介したいと思います。
■ ギヤの歯数の検出
メカトロニクスでは、ギヤは必ずと言っていいほど使われます。その一環でギヤの歯数を数えるという場面は、
しばしば遭遇します。20歯程度なら、容易に数えられるのですが、30歯、40歯…100歯と歯数が増える程、
人間の目で数えるのはとても困難になります。それを自動で数えるものがあったら、便利ではないでしょうか。
ここでは画像処理学習の題材として、ギヤの画像から歯数を自動で数える画像処理プログラムを作成してみました。
■ 画像処理アルゴリズム概要
今回は以下のようなアルゴリズムで、プログラムを作成しました。第1回目は、グレースケール変換まで紹介したいと思います。
■ ギヤ画像の取得
まずは画像処理対象となるギヤの画像を用意します。
今回は歯数が28歯のモールドギヤをCanon IXY DIGITAL600デジタルカメラで撮影しました。
画像が用意出来たら、ctypes OpenCVモジュールをインポートし、OpenCVのcvLoadImage関数で画像をロードし、
cvCreateImage関数で画像データを格納するメモリ領域を確保します。また、cvResize関数を用いて画像サイズを変換します。
from opencv import *
#画像ファイル読込 (ファイル名:sampleImage.JPG)
readImage = cvLoadImage(‘C:\\python26\\Image\\sampleImage.JPG’,
CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR )
#画像サイズ変換(1152×864に変換)
sourceImage = cvCreateImage(cvSize(1152, 864), IPL_DEPTH_8U, 3)
cvResize(readImage, sourceImage, CV_INTER_CUBIC)
次に、画像変換後の画像メモリ領域を同様にcvCreateImage関数で確保します。
あらかじめsizeOfImage関数で元画像のサイズを読み込み、同サイズのものを作成します。
#変換画像メモリ領域確保
sizeOfImage = cvGetSize(sourceImage)
grayImage = cvCreateImage(sizeOfImage, IPL_DEPTH_8U, 1) #グレースケール変換画像用
smoothImage = cvCreateImage(sizeOfImage, IPL_DEPTH_8U, 1) #ぼかし画像用
binImage = cvCreateImage(sizeOfImage, IPL_DEPTH_8U, 1) #2値化画像用
contImage = cvCreateImage(sizeOfImage, IPL_DEPTH_8U, 1) #輪郭検出画像用
次にcvCvtColor関数で、元画像をグレースケールに変換します。
#グレースケール変換
cvCvtColor(sourceImage, grayImage, CV_BGR2GRAY)
画像がグレースケールに変換されたか確認するため、cvShowImage関数で変換画像を表示してみます。
cvNamedWindow関数で、あらかじめ表示用のウィンドウを作成します。
cvNamedWindow(“Image”, CV_WINDOW_AUTOSIZE) #ウィンドウ作成
cvShowImage( “Image”, grayImage) #画像表示
cvWaitKey(0) #何かキーを押されたら終了
記述できたら、いざプログラムを実行してみます。
グレースケール画像に変換出来ました。次回は画像の2値化、ギヤ歯輪郭検出などについて紹介します。
- Comments (Close): 0
- Trackbacks (Close): 0
SolidWorks APIに関する検討
■Solid Works API その1 面の色を変える
普段、Solid Works使うことはないのだが、ある日Solid Worksでモデリングを行うことになった。
簡単な機械部品をモデリングしたり、時間があるときは好き勝手に謎のオブジェクトを作ってみたりした。
ある時マクロの存在に気づいた。マクロでモデルをいろいろ操作できたらおもしろいと思い、ちょっとかじってみることにした。
・面の色を変える
手始めに面の色を変える方法を調べることに。面の色をタイマーか何かで定期的に変更できればモデルを点滅させることが
できるんじゃないか、と。そのとき何も知らなかった自分はそんなことを漠然と考えていた。とりあえずモデルの点滅を目標に作業開始。
まず、APIについてのヘルプを開く。英語だ。早くもくじけそうになった。
何はともあれ、色を変更する面を取得せねばならない(だろう)。
英語のヘルプと格闘しつつ、ネットで情報をあさりつつ、調べたところ、モデル全体のオブジェクトからフィーチャーオブジェクト、
そこからフェイスオブジェクトというように階層的にデータを取得していけば面までたどり着けそうだ。
——————————————————————————————————————
まず始めに、
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
モデルデータを取得。で、
swModel.GetFeatureCount
フィーチャーの数を取得。フィーチャーの個数回ループして
Set swFeat = swModel.FeatureByPositionReverse()
swFeat.Name
フィーチャー名を確認、お目当てのフィーチャーを探す。(もっと効率のいい方法があるんだろうな)
vFaceArr = swFeat.GetFaces
目当てのフィーチャーのフェイスをごっそり取得して、
For Each vFace In vFaceArr
Set swFace = vFace
swFace.MaterialPropertyValues = vFeatColor
全面ループして色の設定。

何とか変わった。
タイマーは面倒くさそうなので、とりあえずwhileで点滅させる。
- Comments (Close): 0
- Trackbacks (Close): 0
Copyright © 2002-2021 Innovative System Solutions Inc. All Rights Reserved.