ロボカップサッカー中型リーグHibikino-Musashiの2016年度HP・Blog更新担当者です。
今後の更新は下のHibikino-Musashiをメインに行ってまいります。
今後はHibikino-Musashiを宜しくお願いします。
Hibikino-Musashi
2016/12/20
2014/05/06
RoboCup Japan Open 2014
ロボカップジャパンオープン2014(5/4~5/6、中型リーグ:北九州学術研究都市)に参加しました。
今年も日本文理大学のチーム「NBU Braves」との合同チームとして出場し、試合・テクニカルチャレンジ両方とも1位という結果を得ることが出来ました。
大会7連覇と、本年度もHibikino-Musashiのロボットは大活躍です。
今回の大会では新しいボール保持機構を搭載した新型機の投入は間に合いませんでしたが、夏に開催される世界大会に向けてこれから調整を進めていきたいと思っております。
今後も変わらぬご支援、ご声援のほどよろしくお願いします。
左(赤マーカ):Hibikino-Musashi 右(青マーカ): 東京工芸大学 (今年2位)
大会7連覇と、本年度もHibikino-Musashiのロボットは大活躍です。
今回の大会では新しいボール保持機構を搭載した新型機の投入は間に合いませんでしたが、夏に開催される世界大会に向けてこれから調整を進めていきたいと思っております。
今後も変わらぬご支援、ご声援のほどよろしくお願いします。
2013/05/07
RoboCup Japan Open 2013 Tokyo
ロボカップジャパンオープン2013大坂(5/4~5/6、玉川大学)に参加しました。
今年は日本文理大学のチームと合同チームという形で試合に臨みました。
結果は堂々の優勝、大会6連覇を達成しました。
テクニカルチャレンジでは、現在制作中の新型ロボットについて発表しましたが、惜しくも入賞には届きませんでした。
決勝後のエキシビションマッチでは、町田ゼルビアの皆さんと試合を行いました。
オランダで開催される世界大会におきましても良い結果を残せるよう、チーム一同 努力していきます。
これからも変わらぬご支援の程よろしくお願いいたします。
今年は日本文理大学のチームと合同チームという形で試合に臨みました。
(左:日本文理大のロボット 右: Hibikino-Musashiのロボット)
結果は堂々の優勝、大会6連覇を達成しました。
テクニカルチャレンジでは、現在制作中の新型ロボットについて発表しましたが、惜しくも入賞には届きませんでした。
決勝後のエキシビションマッチでは、町田ゼルビアの皆さんと試合を行いました。
オランダで開催される世界大会におきましても良い結果を残せるよう、チーム一同 努力していきます。
これからも変わらぬご支援の程よろしくお願いいたします。
2012/08/06
2012/07/17
デモ:大分トリニータ@大分銀行ドーム
こんにちは、今年で6年に渡るロボカップも最後のtakenakaです。
最近、天気が不安定かつ雨が激しいですね。
先週末は、3連休でしたが皆さんはいかがお過ごしでしたか?
私たちHibikino-Musashiは15日には大分銀行ドームで開催された
大分トリニータv.s.湘南ベルマーレの試合に
お邪魔させていただきデモンストレーションを行いました。
サッカーが大好きな少年少女は自律行動をするサッカーロボットに興味心身で
多くの方に、ロボットとのPK対決を楽しんでもらいました。
試合としては、残念ながら大分トリニータは、負けてしまったようですが・・・・
最近、天気が不安定かつ雨が激しいですね。
先週末は、3連休でしたが皆さんはいかがお過ごしでしたか?
私たちHibikino-Musashiは15日には大分銀行ドームで開催された
大分トリニータv.s.湘南ベルマーレの試合に
お邪魔させていただきデモンストレーションを行いました。
多くの方に、ロボットとのPK対決を楽しんでもらいました。
試合としては、残念ながら大分トリニータは、負けてしまったようですが・・・・
2012/06/26
RoboCup 2012 MEXICO
RoboCup世界大会2012メキシコに参加しました。
場所:メキシコ世界貿易センター
日時:6月18日(火)~6月24日(月)
試合では参加6チーム中5位、テクニカルチャレンジ部門は5位と入賞には至りませんでしたが、今年はインプレイ中のパスを中心にチーム戦略を大幅に改良したため、特にディフェンス面において世界のチームから高い評価を得ました。
長かった試合を終え、私たちは現在、来年に向けて新型機の開発に着手しています。
これからもHibikino-Musashiへのご声援をよろしくお願いします。
2012/05/07
RoboCup Japan Open 2012 Osaka
ロボカップジャパンオープン2012大坂(5/3~5/5、大阪工業大学 大宮キャンパス)に参加しました。
試合では、今年から実装されたインプレイ中のパスを披露し、これまでにない戦略的なプレーを進めていきました。
結果は7戦全勝でジャパンオープン5連覇を達成しました。
オランダからの連続出場となり、過密なスケジュールではありましたが、メンバー全員の努力の結果、このような素晴らしい成績を残すことができました。
現段階では世界大会への参加は未定ですが、世界のチームと渡り合えるよう、チーム一同、努力をしていきたいと思います。
2012/05/02
Dutch Open 最終日
こんばんは
テクニカルリーダー兼ゴーリー担当のtakenakaです。
5日間にわたるDutch Openが終わりました。
結果は5チーム中5位と、現状の課題を改めて実感することとなりました。
しかしながら、新規メンバーが多く、経験が少ない中みんな十分に頑張ってくれていたと思います。
Dutch Open 2012結果
8戦8敗 2得点33失点
今大会で優勝したTech Unitedとは一戦目は1-13で大敗をきしてしまいましたが、
最後には0-3に押さえるまでロボットの動きを向上させることができました。
明日から開催される日本大会にむけて
今大会で見つけた課題を解決し、よりよい結果が報告できるよう
取り組む所存でございます。
それでは、大阪工業大学で開催されるロボカップジャパンオープンでお会いしましょう!
皆様にお会いできる日を心待ちにしております。
テクニカルリーダー兼ゴーリー担当のtakenakaです。
5日間にわたるDutch Openが終わりました。
結果は5チーム中5位と、現状の課題を改めて実感することとなりました。
しかしながら、新規メンバーが多く、経験が少ない中みんな十分に頑張ってくれていたと思います。
ビールを飲みながら作業をするフリをするソフト・機械担当者。
今回も、ソフトリーダーであるShinpukuさんにはお世話になりました。
専門的なことだけでなく、慣れない海外での生活で
武村先生とアミール先生に助けていただき大変感謝しております。
Dutch Open 2012結果
8戦8敗 2得点33失点
今大会で優勝したTech Unitedとは一戦目は1-13で大敗をきしてしまいましたが、
最後には0-3に押さえるまでロボットの動きを向上させることができました。
明日から開催される日本大会にむけて
今大会で見つけた課題を解決し、よりよい結果が報告できるよう
取り組む所存でございます。
それでは、大阪工業大学で開催されるロボカップジャパンオープンでお会いしましょう!
皆様にお会いできる日を心待ちにしております。
日本に帰り着いて喜ぶメンバーの図
2012/04/28
大会初日 2日目終了
オランダからお伝えしております.
アドバイザーのtakemuraです。
現在,大会2日目が終了しました.
結果は、・・・・残念ながら全敗(6敗)と厳しい戦いをしいられています。
初日は,いろいろな修正点を見つける事で手一杯でしたが,
2日目からは多少動きも良くなってきています.
しかし,世界の壁は非常に厚くなかなか得点が遠い状況です.
明日、残り2試合全力でがんばります.
You stream で大会の様子がありますので,是非ご覧になってみてください.
http://www.robocupdutchopen.org/home
それでは,オランダの様子をアップロードしておきます.
残り2試合全力でがんばります!
ご声援よろしくお願いします。
アドバイザーのtakemuraです。
現在,大会2日目が終了しました.
結果は、・・・・残念ながら全敗(6敗)と厳しい戦いをしいられています。
初日は,いろいろな修正点を見つける事で手一杯でしたが,
2日目からは多少動きも良くなってきています.
しかし,世界の壁は非常に厚くなかなか得点が遠い状況です.
明日、残り2試合全力でがんばります.
You stream で大会の様子がありますので,是非ご覧になってみてください.
http://www.robocupdutchopen.org/home
それでは,オランダの様子をアップロードしておきます.
残り2試合全力でがんばります!
ご声援よろしくお願いします。
2012/04/24
DutchOpenまで@0日!
おはようございます。
テクニカルリーダーのtakenakaです。
とうとう、オランダに出発する時が着ましたね。
3:00に集合し、7:00の飛行機でオランダに向かいます。
今年のメンバーは海外旅行経験者が少ないので心配ですが
まあ、大丈夫でしょう(適当なのではなく、信頼していると取ってください。
ロボット5台と予備部品などは、ダンボールとスーツケースに入れてもって行きます。
荷物が11個、総重量250kg程度になりました。
これを運ぶとなると大変です;;
ロボット達が、いないので、倉庫がさびしいですね。
ちょっと、準備の段階で散らかってしまったので掃除が必要です・・・
さて、次に福岡に帰ってくるのは5月7日の日本大会終了後ですね。
Dutch Open、Japan Openともに良い結果が残せるよう全力でがんばりますので
何卒、応援のほど宜しくお願いします!
2012/04/22
DutchOpenまで@2日
こんばんは
テクニカルリーダーのtakenakaです。今年は、ゴーリーもやっています。
DutchOpen開催まで、あと2日。
ついに、作業終了予定日となりました。
やっと、ゴーリーアームの改修が完了しました。
白線認識向上のために、位置を少し後ろに下げただけですが...
| 改修前 ゴーリー |
| 改修後 ゴーリー |
見栄え的にも、性能的にもよくなりましたね。
あとは、マザーボードが実に5年ぶりくらいに新しくなりました。
P板で作り直したので、見栄え的にも格好いいですね!
| 完成によろこぶ担当者の様子 「新型がふえるよ。」 「やったね、Hibikino-Musashi!」 |
今年もShinpukuさんの作り上げたプレイヤーたちが、大活躍してくれるでしょう!
ハードウェアは、電装系の改修をテーマに信頼性・安定性向上に取り組んでいます。
作業終了予定日である今日は、ロボット全台を使った最終調整を行う予定です。
現在、メンバー5名と例年より人数が少ないですが、その分チーム一丸となってよい結果が残せるよう頑張っております。
2012/04/11
今年度の大会(予定)
お疲れさまです。マネジメント担当Shinpukuです。
今年度、私たちは2つの大会に出場します。
まず、4/25(水)~4/29(日)にオランダのアイントホーフェンにて開催されるオランダオープン。
そして、5/1(木)~5/5(土)に大阪工業大学で開催されるジャパンオープンです。
チームも新体制となり、試合に向けてロボットの調整を進めています。
2大会連続出場という今までにないギリギリのスケジュールですが、全力で挑みたいと思います!
今年度、私たちは2つの大会に出場します。
まず、4/25(水)~4/29(日)にオランダのアイントホーフェンにて開催されるオランダオープン。
そして、5/1(木)~5/5(土)に大阪工業大学で開催されるジャパンオープンです。
チームも新体制となり、試合に向けてロボットの調整を進めています。
2大会連続出場という今までにないギリギリのスケジュールですが、全力で挑みたいと思います!
2012/03/20
H23年度メンバー送別会
今日はお世話になった先輩方の送別会を行いました。
卒業される先輩方には、現メンバーより寄せ書きとプレゼントをお送りしました。
電気班の真田さん。マザーボードの回路設計や方位センサの実装など、電子回路のプロフェッショナルです。
チームマネジメント担当の北住さん。以前は機械班として、モジュールシステムの実装や新型ホイールの設計をされていました。
機械班の藤本さん。去年から実装されたアクティブフィンガーを設計されました。
電気班の福田さん。ソレノイドキッカーの回路設計と実装をされました。
ゴーリー担当の林さん。世界に通じる高いディフェンスを実現しました。
ソフト班の平尾さん。プレイヤーの行動プログラムを担当されました。去年のテクニカルチャレンジでチームを優勝に導いた方です。
今まで本当にお世話になりました。これからもお元気でご活躍下さい。
私たちも先輩方に負けぬよう努力します。
卒業される先輩方には、現メンバーより寄せ書きとプレゼントをお送りしました。
電気班の真田さん。マザーボードの回路設計や方位センサの実装など、電子回路のプロフェッショナルです。
チームマネジメント担当の北住さん。以前は機械班として、モジュールシステムの実装や新型ホイールの設計をされていました。
機械班の藤本さん。去年から実装されたアクティブフィンガーを設計されました。
電気班の福田さん。ソレノイドキッカーの回路設計と実装をされました。
ゴーリー担当の林さん。世界に通じる高いディフェンスを実現しました。
ソフト班の平尾さん。プレイヤーの行動プログラムを担当されました。去年のテクニカルチャレンジでチームを優勝に導いた方です。
今まで本当にお世話になりました。これからもお元気でご活躍下さい。
私たちも先輩方に負けぬよう努力します。
2012/01/19
2012/01/01
新年の御挨拶
あけましておめでとうございます。
昨年3月11日。
日本は未曽有の大災害に見舞われました。
多くの方が被害にあわれ、大変な一年になりました。
今年はそのような悲しい出来事がない素晴らしい一年になればと思っています。
また本年度のHibikino-Musashiメンバーにおいては、
今からますますの努力が必要になります。
力不足である我々ですので、
今後とも変わらぬ御厚誼と御指導賜りますようお願いいたします。
最後になりますが、皆様の御健康と御多幸をお祈りいたします。
2011年 元日
Hibikino-Musashi メンバー 一同
昨年3月11日。
日本は未曽有の大災害に見舞われました。
多くの方が被害にあわれ、大変な一年になりました。
今年はそのような悲しい出来事がない素晴らしい一年になればと思っています。
また本年度のHibikino-Musashiメンバーにおいては、
今からますますの努力が必要になります。
力不足である我々ですので、
今後とも変わらぬ御厚誼と御指導賜りますようお願いいたします。
最後になりますが、皆様の御健康と御多幸をお祈りいたします。
2011年 元日
Hibikino-Musashi メンバー 一同
2011/12/26
OpenCVで作るビジョンプログラム(5)
お疲れさまです。Shinpukuです。
白線情報を元にした自己位置推定法では、白線をいかに多く検出できるかが鍵となります。
メジャーなのはスキャンライン(走査線)を使った方法です。
最新のプログラムでは、スキャンラインは近・中・遠距離の3段構成でそれぞれ32本、64本、128本配置されています。多段構成にすることで、手前の白線だけでなく、その奥の白線も検出することが出来ます。
では、ソースコードを見ながら白線検出アルゴリズムを説明していきます。
cvThresholdで白色を抽出し、前回検出したフィールド領域との論理積をとります。白色は輝度が高いのでYに閾値を設定すればすぐに抽出できます。白線以外のものを検出しないようにマスクをかけるとなお良いでしょう。
スキャンラインの総数は以下の式で求められます。
コードにするとこんな感じです。
const int LAYER_NUM = 3;
const int LINE_NUM = 32;
const int TOTAL_LINE_NUM = (LINE_NUM*((1<<LAYER_NUM)-1));
i番目のスキャンラインの開始・終了点は以下の式で求められます。
求めた式を元に、画像の中心からスキャンラインを伸ばし、白線を検出します。
void Vision::detectLines(Data &data)
{
const int minLen = 35;
const int maxLen = 110;
// フィールドとの論理積
cvAnd(images.cvWhite, images.cvField, images.cvLines);
// ここから白線検出
for (int i = 0; i < LAYER_NUM; i++) {
// スキャンライン数
int lineNum = LINE_NUM * (1<<i);
// 角度の変化
double theta_k = (2.0 * M_PI) / lineNum;
// 始点・終点
int start = (int)(minLen + (i+0) * (maxLen - minLen) / LAYER_NUM);
int end = (int)(minLen + (i+1) * (maxLen - minLen) / LAYER_NUM);
// スキャンラインを走査
for (int j = 0; j < lineNum; j++) {
// i層j番目のスキャンライン
int k = LINE_NUM * ((1<<i)-1) + j;
// スキャンライン角度
double theta = -(j * theta_k + M_PI/2.0);
// 初期化
lines[k].distance = -1.0;
lines[k].angle = 0.0;
// 始めから終わりまで
for (int l = start; l < end; l++) {
CvPoint scanline;
scanline.x = (int)(l * cos(theta) + images.center.x);
scanline.y = (int)(l * sin(theta) + images.center.y);
uchar val = CV_IMAGE_ELEM(images.cvLines, uchar, scanline.y, scanline.x);
// 白線が見つかった
if (val > 0) {
// 検出した白線を表示
lines[k].angle = CV_IMAGE_ELEM(images.cvAngle, float, scanline.y, scanline.x);
lines[k].distance = CV_IMAGE_ELEM(images.cvDistance, float, scanline.y, scanline.x);
break;
}
}
}
}
}
次回はパーティクルフィルタを用いた自己位置推定アルゴリズムを詳しく解説していこうと思います。
白線情報を元にした自己位置推定法では、白線をいかに多く検出できるかが鍵となります。
メジャーなのはスキャンライン(走査線)を使った方法です。
最新のプログラムでは、スキャンラインは近・中・遠距離の3段構成でそれぞれ32本、64本、128本配置されています。多段構成にすることで、手前の白線だけでなく、その奥の白線も検出することが出来ます。
では、ソースコードを見ながら白線検出アルゴリズムを説明していきます。
cvThresholdで白色を抽出し、前回検出したフィールド領域との論理積をとります。白色は輝度が高いのでYに閾値を設定すればすぐに抽出できます。白線以外のものを検出しないようにマスクをかけるとなお良いでしょう。
スキャンラインの総数は以下の式で求められます。
コードにするとこんな感じです。
const int LAYER_NUM = 3;
const int LINE_NUM = 32;
const int TOTAL_LINE_NUM = (LINE_NUM*((1<<LAYER_NUM)-1));
i番目のスキャンラインの開始・終了点は以下の式で求められます。
求めた式を元に、画像の中心からスキャンラインを伸ばし、白線を検出します。
void Vision::detectLines(Data &data)
{
const int minLen = 35;
const int maxLen = 110;
// フィールドとの論理積
cvAnd(images.cvWhite, images.cvField, images.cvLines);
// ここから白線検出
for (int i = 0; i < LAYER_NUM; i++) {
// スキャンライン数
int lineNum = LINE_NUM * (1<<i);
// 角度の変化
double theta_k = (2.0 * M_PI) / lineNum;
// 始点・終点
int start = (int)(minLen + (i+0) * (maxLen - minLen) / LAYER_NUM);
int end = (int)(minLen + (i+1) * (maxLen - minLen) / LAYER_NUM);
// スキャンラインを走査
for (int j = 0; j < lineNum; j++) {
// i層j番目のスキャンライン
int k = LINE_NUM * ((1<<i)-1) + j;
// スキャンライン角度
double theta = -(j * theta_k + M_PI/2.0);
// 初期化
lines[k].distance = -1.0;
lines[k].angle = 0.0;
// 始めから終わりまで
for (int l = start; l < end; l++) {
CvPoint scanline;
scanline.x = (int)(l * cos(theta) + images.center.x);
scanline.y = (int)(l * sin(theta) + images.center.y);
uchar val = CV_IMAGE_ELEM(images.cvLines, uchar, scanline.y, scanline.x);
// 白線が見つかった
if (val > 0) {
// 検出した白線を表示
lines[k].angle = CV_IMAGE_ELEM(images.cvAngle, float, scanline.y, scanline.x);
lines[k].distance = CV_IMAGE_ELEM(images.cvDistance, float, scanline.y, scanline.x);
break;
}
}
}
}
}
2011/12/23
進捗
こんにちは、Noguchiです。
今日は今(12/14現在)の活動内容を簡単に紹介します。
まず、ハード班です。
Shimizuはバッテリー部の改良です。
以前より、バッテリーの故障が目立っていました。
調べていくうちに様々な問題点が浮き彫りになってきており、現在改良中です。
この件については、年明けにでもブログ1回分取って、詳細説明いたします。
Tsutsumiはロボットカバーの改良とキッカー部分のリフター付けです。
カバーは以前に比べて、取り外しがしやすいものへと変更いたしました。
リフター部に関しては、キッカー部分に付けています。
図の○の箇所になります。
今日は今(12/14現在)の活動内容を簡単に紹介します。
まず、ハード班です。
Shimizuはバッテリー部の改良です。
以前より、バッテリーの故障が目立っていました。
調べていくうちに様々な問題点が浮き彫りになってきており、現在改良中です。
この件については、年明けにでもブログ1回分取って、詳細説明いたします。
Tsutsumiはロボットカバーの改良とキッカー部分のリフター付けです。
カバーは以前に比べて、取り外しがしやすいものへと変更いたしました。
リフター部に関しては、キッカー部分に付けています。
図の○の箇所になります。
これを付けることにより、ボールと蹴ったときに浮いたボール、俗に言うループボールを
放つことが出来るようになりました。
しかしながらこれを付けたことにより、ドリブル等の別の問題点が発生すると話し合いにより、
判断し、更なる改良が必要だと考えております。
次にソフト班です。
InoueはPKの改良を行いました。
人間の行うPKとは異なり、ロボットはセンターサークルより動き始め、30秒以内に
ボールを蹴るというのが、ロボカップサッカー中型リーグにおけるルールです。
ルールに基づき、プログラムを新しいものへ変更いたしました。
ゴール確率もある程度期待できるモノになっております。
今後はインプレイ中のシュート条件の改良を行って行く予定です。
Noguchiは経路計画の再考をしております。
現在、机上で検討しております。
検討終了後に、プログラムへ移行する予定です。
こちらに関しても、詳しい事が言える段階で説明いたします。
Takenakaはゴールキーパーのプログラムを新バージョンへ移植しております。
--
先日の清掃の続きを行いました。
問題の倉庫でしたが、棚や道具の配置替えをし、必要用途や頻度に
合わせて棚の整理をしただけで、きれいになりました。
残りは、いろいろな場所に転がっていたネジの分類分けと雑用です。
地味な作業ではありますが、大事なことです。
"塵も積もれば山となる"ですね。
2011/12/19
OpenCVで作るビジョンプログラム(4)
こんにちは、Shinpukuです。
今回はフィールド領域の検出を行います。
これはフィールド外の物体を誤って検出しないようにするためです。
それではアルゴリズムを紹介していきます。
まず、閾値処理により緑色を抽出します。
次にノイズ除去のため膨張・収縮を行います。
一番大きい領域のみ残します。
cvConvexHull2関数を用いて欠けた領域の補間を行います。
これでフィールド領域を検出することが出来ました。
黄色や白色との論理積を取ることでボールや白線を検出することができます。
コードは以下の通りです。
void Vision::detectField(Data &data)
{
double max = 0;
CvSeq *contour = NULL, *maxContour = NULL;
CvMemStorage *contourStorage = cvCreateMemStorage();
// 膨張・縮小
cvMorphologyEx(images.cvGreen, images.cvField, NULL, NULL, CV_MOP_CLOSE);
// 中心円を描く
const int radius = MIN(IMAGE_HALF_WIDTH, IMAGE_HALF_HEIGHT) * 0.3;
cvCircle(images.cvField, images.center, radius, cvScalarAll(255), -1);
// 輪郭を抽出
cvFindContours(images.cvField, contourStorage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
// 一番大きい領域を求める
while (contour) {
double size = fabs(cvContourArea(contour, CV_WHOLE_SEQ));
if (size > max) {
maxContour = contour;
max = size;
}
contour = contour->h_next;
}
// 初期化
cvZero(images.cvField);
// 見つかった
if (maxContour) {
// 凸包を求める
CvSeq *hull = cvConvexHull2(maxContour);
// 凸包を構成する点
CvPoint *pts = new CvPoint[hull->total];
for(int i = 0; i < hull->total; ++i) pts[i] = **(CvPoint**)cvGetSeqElem(hull, i);
// フィールド領域を描画
cvFillConvexPoly(images.cvField, pts, hull->total, cvScalarAll(255));
cvAnd(images.cvField, images.cvMask, images.cvField);
// メモリ解放
delete [] pts;
}
// メモリ解放
cvReleaseMemStorage(&contourStorage);
}
次回は白線を検出してみようと思います。
今回はフィールド領域の検出を行います。
これはフィールド外の物体を誤って検出しないようにするためです。
それではアルゴリズムを紹介していきます。
まず、閾値処理により緑色を抽出します。
次にノイズ除去のため膨張・収縮を行います。
一番大きい領域のみ残します。
cvConvexHull2関数を用いて欠けた領域の補間を行います。
これでフィールド領域を検出することが出来ました。
黄色や白色との論理積を取ることでボールや白線を検出することができます。
コードは以下の通りです。
void Vision::detectField(Data &data)
{
double max = 0;
CvSeq *contour = NULL, *maxContour = NULL;
CvMemStorage *contourStorage = cvCreateMemStorage();
// 膨張・縮小
cvMorphologyEx(images.cvGreen, images.cvField, NULL, NULL, CV_MOP_CLOSE);
// 中心円を描く
const int radius = MIN(IMAGE_HALF_WIDTH, IMAGE_HALF_HEIGHT) * 0.3;
cvCircle(images.cvField, images.center, radius, cvScalarAll(255), -1);
// 輪郭を抽出
cvFindContours(images.cvField, contourStorage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
// 一番大きい領域を求める
while (contour) {
double size = fabs(cvContourArea(contour, CV_WHOLE_SEQ));
if (size > max) {
maxContour = contour;
max = size;
}
contour = contour->h_next;
}
// 初期化
cvZero(images.cvField);
// 見つかった
if (maxContour) {
// 凸包を求める
CvSeq *hull = cvConvexHull2(maxContour);
// 凸包を構成する点
CvPoint *pts = new CvPoint[hull->total];
for(int i = 0; i < hull->total; ++i) pts[i] = **(CvPoint**)cvGetSeqElem(hull, i);
// フィールド領域を描画
cvFillConvexPoly(images.cvField, pts, hull->total, cvScalarAll(255));
cvAnd(images.cvField, images.cvMask, images.cvField);
// メモリ解放
delete [] pts;
}
// メモリ解放
cvReleaseMemStorage(&contourStorage);
}
次回は白線を検出してみようと思います。
2011/12/14
御挨拶と年末大掃除
お初に目にかかります。
2012年度ソフト班・HP担当になりましたNoguchiです。
今後、Hibikino-Musashiの日々の活動や技術的なお話ができればと思っております。
文章能力に欠ける私でありますが、温かく見守っていただけると幸いです。
--
先代より代替わりが行われ、早2ヶ月が経つでしょうか。
先日、年末ということもあり、部屋の大掃除を行いました。
片付けの最中です ( 掃除前の画像は取り忘れました… )
登録:
投稿 (Atom)























