今年から始めたwordpress、年の瀬ということで振り返ってみる。
WordPressに移行した MacにBootcampでWindows8をインストールした後にパーティションを追加するとWindows8が起動しなくなる問題の解決法 GitHubアカウントを取得した。 Macで始めるGUIを使わないやさしくないGit XcodeでOpenCV始めると大変 XcodeのOpenCVでカメラを使ってみる htc j butterflyの充電スタンドを作った OpenCVで顔認識 しゃべってコンシェルにげきおこ XcodeとOpenCVで特徴点検出 GitHubにSSH鍵を追加してそれからどうするつもり? プログラミングなんてできるわけがない lightline.vimの導入 インターンシップを終えた。 MacBookProが壊れたと思う Macbay2とSSDでMacBookPro延命措置 プロコン競技で惨敗したよ ubuntu13.10とWindows8(8.1)のデュアルブートで悩まされたいくつかの問題 そしてこれ。計19記事。
1位:OpenCVで顔認識(2009view) 2位:XcodeでOpenCV始めると大変(1964view) 3位:MacにBootcampでWindows8をインストールした後にパーティションを追加するとWindows8が起動しなくなる問題の解決法(1250view) 4位:XcodeのOpenCVでカメラを使ってみる(1227view)
やはりOpenCV関連が多い。他webページからリンクされてるのもある。これは純粋に嬉しかった。
9月:286view(19人/日) 10月:1318view(43人/日) 11月:1507view(50人/日) 12月:1507view(49人/日) 計:4618view(43人/日)
ブログを始めたのは5月からだけどJetpackを導入したのが遅かったから9月からしか記録がない。
サーバー代金:7650円 ドメイン代:2140円 計:9790円 振込手数料が毎回525円かかるのが辛いね。
下書きが3つと、下書きすら始めてないのが1つあるのでなるべく早く書いて公開したい。あと、XcodeでのiOSアプリ開発についても全く書く目処が立っていない。 それ以前に就活が始まるのでどうしようもない。 あと、高いもの買った時に「○○買った」みたいなレビューも書いてみたいからお金欲しい。
この記事はうなすけAdvent Calendarの23日目の記事です。 冬休みということもあり、早速OSのインストールを始めたわけですが、いくつかの問題にぶち当たりググってる間にもうクリスマスになってしまいました。 ここでは、Windows8をUEFIでインストール→ubuntu13.10を別パーティションにインストール→Windows8.1にアップデートの手順の中で発生した問題について自分なりの解決方法を書き留めておく記事なので間違ってたりしても責めないでほしい。僕はこれで満足している。いや問題が発生する時点で満足なんてしていないけども。
Windows8のインストールは特に問題もなく終了。さあubuntuのインストールに移る。 参考にしたこれら デュアルブート(UEFI Win8 + Ubuntu13.04) その4 - Ubuntuをインストールする・UbuntuをUEFIから起動する ~~ [Ubuntu13.04]Windows7とのデュアルブート(リンク切れ) ~~ の記事には、 「ブートローダはefiパーティションにインストールしろ」 「ブートローダはrootパーティションにしろ」 と書いてあることが違う。実際に試してみたが、どちらにブートローダをインストールしてもWindowsしか立ち上がらなかった(grubは起動しなかった)。
結局、 ブートローダ(grub)はハードディスクを指定してインストール した。(例えば/dev/sdaとか。)
Windows8からはWindows8.1へ無料でアップデート(アップグレード?)できるのだが、アップデートしたらgrubをすっ飛ばしWindowsしか起動しなくなった。これはいかん。 過去に帰ってきたGRUBとして同じような問題の解決法を書いたが、今はもっといいものがある。 それがBoot-Repairである。 LiveDVDなどからubuntuを起動し、端末で以下のコマンドを実行、Boot-Repairをインストールする。
$ sudo apt-add-repository ppa:yannubuntu/boot-repair
$ sudo apt-get update
$ sudo apt-get install boot-repair
※$←は一般ユーザ権限で実行(それにsudoがついて管理者権限)なので入力しなくていい あとはBoot-Repairを起動しRecommended repairでなんとかなった。 参考URL Boot-Repair Ubuntu Boot Repair その1 - OSの起動に関する問題を修復するアプリの紹介・インストールと起動
Windows領域にアクセスしようとすると、以下のようなメッセージが出てマウントできない。
Error mounting system-managed device /dev/sda4: Command-line `mount “/media/unasuke/windows”‘ exited with non-zero exit status 14: Windows is hibernated, refused to mount. Failed to mount ’/dev/sda4’: Operation not permitted The NTFS partition is in an unsafe state. Please resume and shutdown Windows fully (no hibernation or fast restarting), or mount the volume read-only with the ‘ro’ mount option.
要するに、ハイバーネートとか高速起動するなと言っている。
そこで、まずWindowsでコントロールパネル→ハードウェアとサウンド→電源ボタンの動作の変更を開き、「高速スタートアップを有効にする(推奨)」のチェックを外す。
その後、ubuntuから以下のコマンドでマウントできる。
sudo mount -t ntfs-3g -o remove_hiberfile /dev/sda4 /media/unasuke/windows
/dev/sda4 とか/media/unasuke/windowsとかは適宜変更する。 ただ、ntfs-3gのmanページにあるremove_hiberfileオプションについて見ると……
remove_hiberfile Unlike in case of read-only mount, the read-write mount is denied if the NTFS volume is hibernated. One needs either to resume Windows and shutdown it properly, or use this option which will remove the Windows hibernation file. Please note, this means that the saved Windows session will be completely lost. Use this option under your own responsibility.
とあるように自己責任で。
ただ、このコマンドは一時的なもので、再起動するたびにこんなことになる。
ので、
$ sudo vim /etc/fstab
なりなんなりでfstabにremove_hiberfileオプションを付加しなければならない。
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
#Entry for /dev/sda4 :
UUID=AAAAAAAAAAAAA /media/unasuke/windows ntfs-3g defaults,remove_hiberfile,locale=ja_JP.UTF-8 0 0
#UUID=307B-FA73 /boot/efi vfat defaults 0 1
例えばこんなふうに。UUIDはblkidコマンドなどで調べられる。書き込めたら再起動で確認してみよう。起動しなかったらOS再インストールしよう。
How do I mount a hibernated NTFS partition? ・NTFS パーティションを起動時に mount する
これで問題は解決した。メリークリスマス。
予選で負け、1回戦で負け、敗者復活でも負けました。そんなプロコン旭川のことを振り返ります。
まずは我が福井がどのような戦略で挑んだのか説明します。 重要なのは 速く そして 多くの 情報を伝えることです。
試合で撮影された画像を見ていると、サイコロを斜めにしたり、3つのサイズを使い分けたりするチームが多く見られました。福井の画像は、パケット内に大サイコロが敷き詰められています。これにより、向きを考えずに済み、大きさを選ぶ時間もなく、配置する場所も調整する必要なく、とても速くサイコロを並べることができます。具体的には、1分30秒以内にはひとつのパケットを完成させ、配置のチェックもすることができます。また送信側には2人居るので、実質1分30秒以内に2パケット完成させることができます。
問題文は、.txtファイルで渡され、ファイル名も事前にわかるようになっていました。そこで、USBメモリが挿入されると同時に、.txtファイルのオープン、問題文の読み込み、符号化そしてパケット例の表示を自動で行うプログラムも作成しました。競技の様子を見てもらえればわかると思いますが、試合開始とほぼ同時にサイコロを並べ始めることが可能になっています。 また2台のパソコンでLANを構成し、パケット例をそれぞれに表示させることで、2人が同時にパケットを作ることが可能になっています。
これは後述の多くの情報を伝えるための工夫と内容が被ってきます。 より速くサイコロを並べるために、使う目のことも考えました。 問題文は最短で1文字とFAQで公表されていました。つまり、問題文が「A」という可能性も十分ありました。そんな状態で圧縮やサイコロの目を気にしている時間はありません。そこで、1の目とそれ以外の2種類の値を使うプロトコルと1から6の目の6種類の値を使うプロトコルの2種類のエンコード方式を実装し、問題文の長さにより使い分けるようにしました。前述の1分30秒というのは2種類の値のみ使う場合の時間です。
福井チームが使うサイコロは、パケット内に並べた場合一番数が少ない大サイコロです。そのために、情報の圧縮は不可欠でした。そこで、定型文、中学1年から3年までで習う英単語、アイヌ語の辞書化を行い、情報の圧縮を試みました。 ハフマン符号や、バイナリデータ圧縮を用いる方法もありますが、このような辞書化を行うことで、ある程度は目で見て並べ間違いのチェックができます。 前述したように、エンコード方式も2つ用意し、長い文章の場合はよりパケットが少なくなるようにしました。
パケットの読み取りには、OpenCVを用いた画像処理を採用しました。しかし、人の目に勝る画像処理エンジンはありません。そこで、テンキー(持ち込みができないので、テンキー付きキーボードのノートパソコンを使用)による打ち込みもできるようにしました。一方で、調子のいい時には人の手を介さずに回答送信まで出来るようなシステムも開発しました。
予行練習、福井チームは「負けること」を想定していました。大事なのは撮影データを集めることであり、勝敗ではありませんでした。(大会側からのデータは信用できない病に感染している) 画像受信URLを間違え自チームの画像をダウンロードできずに試合終了 ヤッチマッタァ!! これでは1回戦までに画像処理のチェックができません。そこで急遽沖縄高専に予選での撮影画像を頂くことに。ありがとうございました沖縄高専!(絶対解読できないだろうからって言われたときはカッコイイって思った)
試行回数がイッちゃってるのは仕様です。さて、もともとは前述の通り、問題文の長さによってエンコード方式を変える予定でしたが、予行練習の結果を見るに10数文字送信できれば1回戦突破は確実。そこで、並べるのが速い方を使うことになりました。が…… 問題文長すぎてエンコードに失敗、予行練習の文字列を送信してしまう_ ナンテコッタァ!! ちなみにこの時は完璧に画像処理でデコードすることができていました。つまり正しい問題文をエンコードできていれば1回戦突破でした。悔しい。
エンコード部分のバグを直して挑んだ敗者復活戦。入念にチェックをし、試合に挑む。 照明のセッテイングミスにより画像認識できず ソンナバカナァ!! パケット内で極端に明暗の差が出てしまい、画像処理ができませんでした。
問題文の長さだったり、照明の具合なんかは少し考えればわかったことです。競技では、サイコロを速く並べることばかり考えてて、そのことに全く気が付きませんでした。落ち着いて、柔軟に対応が出来ればよかったです。
送信側3人とか福井もできたしそもそもうまく行っていれば確実に順位つくレベルまでいけたし正解文字数3桁とか楽勝だったし……まじ……
今回の作業で初めてC++を触って、MacPortsを使ってインストールしたOpenCVを触って、Macが壊れて、Boxenに手を出すついでにGitHubやHomebrewにも手を出して……と、新しいことにチャレンジすることが多かったです。大変だった反面、楽しくもありました。それらに手を出したばかりでっていうのも中途半端なので、ひとまずBoxenとGitからいろいろ勉強していきたいです。 Xcodeがすごく便利でした。Macが使い物にならなくなってからはWindowsのVisual C++で開発していたのですが補完などしてくれないことも多く使っていて辛かったです。C#のほうだとうまくやってくれるらしいですが。 開発中、僕が触るとなぜか動かなくなるという能力を本番で生かしきれなかったのも悔しいです。
できれば来年も競技に出場したいのですが、卒業研究、就職活動、成績など考えるとどうも難しい……留年すればそれらの問題はスパっと解決するのですがその選択もどうなんだ、と。なかなか難しいですね。
北海道から帰ったらHDDがお亡くなりになってました。
秋葉館が販売しているHDD(SSD)マウンタ。光学ドライブの場所にHDD(SSD)を設置できる。 光学ドライブスペース用HDD/SSDマウンタ Macbay2 RGH25BAY2-001
これを買ってSSDにOS Xをインストールし、延命を図ろうという作成。
画像が多いです。
まずはSSDとMacbay2を用意。裏蓋を開ける。
各コネクタを外す。ついてきたヘラでやったほうがいいかもしれない。赤黒はヘラで持ち上げ、ただの黒い線は引っ張る。SATAケーブルはヘラでうえに持ち上げる。
(多分)スピーカーを外す。ただ斜め上に持ち上がるだけで完全には外れない。無理に引っ張るとどこかしら断線する雰囲気。
光学ドライブを固定しているネジ3つを外す。
Macbay2にSSDを取り付け、光学ドライブから外した固定用の部品とケーブルをつける。SSDをもともとHDDがあった場所に入れる例もwebでよく目にするが、今HDDがある場所には衝撃を吸収する部品があるのでHDDは動かさない。
光学ドライブと同じようにMacbay2を固定……と行きたかったが、ネジの長さが足りない。Macbay2に細工もしてみたがどうやら無理。Macbay2についてきたネジと、純正のネジの比較がこれ。
左の小さいのが純正、右の大きいのがMacbay2付属
こんなもんねじ込めるか馬鹿
しかもついてきたのタッピングビスだしふざけてる。
しかたなくこうした。
セロハンテープは危険。後が残るかも。これはクリアテープ。
上の写真では終わっているが、あらゆるネジや部品を元通りにして蓋をしめる。
OS Xの再インストールはネットワーク経由で行う。起動時に「⌘+R」でインターネットリカバリを行う。
SSDを初期化してからOS Xをインストールすること。
あとはよしなに。
僕のインストールの様子
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386500671857360896”>October 5, 2013
主に日本語を使用します #OSXinstallbuttle pic.twitter.com/9YhzB69j3v
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386500959469187073”>October 5, 2013
まず消去しちゃいましょう #OSXinstallbuttle pic.twitter.com/QwbnxyiPUe
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386501331365539841”>October 5, 2013
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386501623670792192”>October 5, 2013
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386501813655990272”>October 5, 2013
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386507471881138177”>October 5, 2013
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386509027158401025”>October 5, 2013
— うなすけ(EXCBADACCESS) (@yusuke1994) <a href=“https://twitter.com/yusuke1994/statuses/386518352815861761”>October 5, 2013
2013-12-26 リンクURLを訂正
2012年6月に買ったMacBookProが壊れた。いや、正確には壊れていないのかもしれないが、とにかく動作が重い。クリックのたびに虹色グルグルに待たされ、入力した文字は途中で消え、IMEが落ちる。こんな状況では作業なんて出来るわけがない。
壊れたのはこれが初めてではない。今年の7月には、HDDを認識しなくなり3万円で修理に出した。その時はHDDケーブルの破損だったが、今度はHDDが逝ってしまわれたのか。
現在はデータのバックアップを取りつつ、SSDが届くのを待っている。プロコンが目前だというのに、OSから入れなおすのはとてもつらい。
HDD外してubuntuでデータを単純にコピーしてるけど、これができるってことはHDD壊れてないかもしれない?
さて、この2週間はインターンシップでとある企業に通っていた。企業名は出してもいいのかもしれないが許可をもらっていないのでここでは言わないことにした。
さて、僕がインターンシップで何をしてきたか。それは「iOSアプリの開発」である。僕はiOSプログラミングも、Objective-Cも、そもそもオブジェクト指向プログラミングさえもやったことがなく、それはインターンシップの相方も同じであった。そんな2人がチームを組んで作ったアプリだ。出来がいいわけがない。それでも、iOSプログラミングの初歩を学ぶことが出来た。
さて、とりあえずアプリは完成した。AppStoreに出すのは金がなくてできないが、公開する方法はGitHubなりなんでもある。だから僕は公開しようと思うが、これはチームでの成果だ。画像も画像なので、そのまま公開するのは、無理だ。
そこで。今はやることがありすぎて手一杯なのですぐという訳にはいかないが、1から作り直し(画像関係の削除と相方の担当分を書き直すのみ)て公開し、作り方を(自分でも忘れないように)ここに書いていこうと思う。文章量が多くなるのは簡単に想像がつく。が、やりたい。
iOSでのアプリ開発ができるようになってから何年経っただろうか。インターネットには解説が溢れ、書店に行けば「iPhoneアプリの作り方」なんて本がいくらでも並んでいる。そんな状況で自分で最初から説明するのは確かに無駄かもしれないが、自分の理解が深まるし、様々な書籍やwebサイトを見ても分からなかった部分というものがあるので、その部分の説明などは決して無駄ではないと思う。というかいいこと書いてるようだがただPVが欲しいだけである。
申し訳ない申し訳ない……コメントとかで急かすと作業が早くなるかもしれません……
どうも、vim-airlineの導入に手こずって放置する程度のvim力の持ち主ことうなすけです。
さて、Qiitaをチェックしているとまた良さげなlightline.vimなるものを見つけてまあ早速導入しました。そんな時間ないけど。
例えばvim-airlineを導入直後だとこんな表示です。
fontがおかしいっていうか。なんかスッキリしない。
まずNeoBundleを導入する必要があったりしますがまあ今はそれについては置いといて。
こうして
:NeoBundleClean
して
:NeoBundleInstall
して
こうじゃ
おお……なんかそれっぽい。
あとはカラースキームをsolarizedにしたいんだけどreadmeが英語の上にvim力低いのでよくわかりません。どなたか教えてください。見返りはないです。
貼る画像間違えてた。あと、.vimrcにこう書けばsolarizedになる。焦ったらだめね。
NeoBundle 'itchyny/lightline.vim'
let g:lightline = {
\ 'colorscheme' : 'solarized' ,
\}
作者のitchynyさんありがとうございます。
そんな意見を聞いたことがある。実際はどうかわからないし、調べる気も起きない。 たとえばenchant.jsはゲームプログラミングの敷居を下げようとしているし、文部科学省ではプログラミンなんていう子供にもプログラミングが体験できるようなwebページを公開している。ドットインストールには僕も助けられている。
プログラミングの入門書はいくつも出版され、勉強会や講習会も多く開催されている。プログラミング人口を増やそうという試みが、全国的に、というか世界的に広がっている。
それでも、例えばプログラミングを義務教育に導入したとして、プログラマが増えるとは僕には思えない。それはなにも「数学を学んだから大学で数学を専攻するようになる」とか、「国語を学んだから小説家になる」とか(飛躍し過ぎだとは思うが)いう、エキスパートになることができないということではなく、「数学を勉強したが二次方程式は解けない」とか「国語を学んだが助詞が未だに正しく使えない」とかいうレベルでできないものはできないのだ。当たり前といえば当たり前であるが。
なぜプログラミングができないのか。それはやはり世界が違うからだ。数学は数の世界に、言葉は言葉の世界に分かれている。言葉の世界は生まれた時から強制的に放り込まれているからこの世界には慣れたものだし、この世界でうまくやれないと何をするにも難しい。数の世界なんかもある程度うまくやっていけないと文明社会で生きるには辛いものがある。
ところがプログラミングの世界ときたら、そんな世界に順応する必要があるわけでもなく、そのうえにその世界の住人から、自分たちの慣れ親しんだ世界用の成果物が放っておいてもどんどん出てくる。頼んでもないのにだ。こんな状況でプログラミングの世界に無理して慣れる必要なんて無い。
それに、プログラミングの世界には理解し難い、初見ではクリア不可能とも言える壁が存在する。 例えば数の世界の「ある数字の各桁の数の合計が3の倍数ならその数字は3の倍数である」というお作法(?)をプログラミングの世界の言葉で書くことを考える。
もう無理である。 数の世界でどうするか考え、それをプログラミングの世界の言葉にすることがまず難しい。各桁の数は一目瞭然だし、それぞれの数を足すのだって造作も無い。 しかしプログラミングの世界では、int型で数を覚えるのはわかっていても、
int num = 12345;
こっから「1」をどう取り出したらよいものか全くわからない。現実世界とのつながりが見えないのだ。だってプログラミングの世界だし。
#include<stdio.h>
int main(void){
int num = 12345;
int sum = 0;
for( ; num != 0; num /= 10 )
sum += num % 10;
if( sum % 3 == 0 )
printf("3で割り切れる");
return 0;
}
と、書かれたら「ああそんなやり方があったのか」と納得し、これからはこの方法を使って3の倍数かどうか求められるだろう。
コンピュータは「あいまい」を許さない。理解できない。それはつまり、プログラミングの世界で生きるためには完璧を求められるということ。それもプログラミングの世界での生き辛さの原因である。「アレ」とか「そこの奥」とかで通じたものが、いきなり「~/Documents/myExcelDocuments/明細.xlsxのA3」だなんて、無理だ。
今まで曖昧が許される世界にいただけあって、急にガチガチの間違えられない異世界に放り込まれると戸惑う。ただ、その世界が心地よい人もいる。人それぞれなのだ。プログラミングの世界に馴染むことのできない人は、数学の世界などのそれよりも多いだろう。プログラミングができないのは未経験だからではなく、その世界に住むことができないからだ。
僕もプログラミングの世界に住んではいる。いるが、その世界の中にもさらに世界がある。Cの世界だったり、Javaの世界だったり、その中でもandroidの世界がまたあったり……いま僕はiOSの世界に放り込まれて悪戦苦闘している。そんななかでふと思い浮かんだから書いてみただけである。プログラミングは難しい。今までのお作法が通じなかったりする。
とりあえず今作っているのが完成したら自分でまとめ直す。ので時間くれ。
共通鍵暗号と公開鍵暗号の解説とSSHでの認証手順 SSHの公開鍵と秘密鍵の関係 こういうところを読めば何となく分かるように、つまりは通信を暗号化するための鍵である、と。
必要な物は
まあ言わずもがな。
端末で
$ ssh-keygen
と入力すると、保存場所とパスフレーズを聞かれるので、それぞれこのように(パスフレーズは好きに)
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): github_id_rsa
Created directory '/Users/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/username/.ssh/github_id_rsa.
Your public key has been saved in /Users/username/.ssh/github_id_rsa.pub.
The key fingerprint is:
00:11:22:33:44:55:66:77:88:99:aa<img alt="🇧🇧" class="emoji" src="/images/emoji/unicode/1f1e7-1f1e7.png">cc:dd<img alt="🇪🇪" class="emoji" src="/images/emoji/unicode/1f1ea-1f1ea.png">ff username@username-mac.local
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| |
| |
| |
| |
| |
| |
+-----------------+
これでSSH鍵ができましたーやったー!
SSH鍵の名前をデフォルトから変更したので、".ssh/config"に以下のように記述する。
Host github.com
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa</pre>
あと、権限を変更しておく。
$ chmod 600 .ssh/github*
.ssh/github_id_rsa.pub
の中身をまるごとコピーする。
GitHub Setting SSH KeysからAdd SSH Keyをクリックして
ペーストする
端末で、
$ ssh git@github.com
を実行した結果が以下のようになれば成功!
$ ssh git@github.com
The authenticity of host 'github.com (204.232.175.90)' can't be established.
RSA key fingerprint is 00:11:22:33:44:55:66:77:88:99:aa<img alt="🇧🇧" class="emoji" src="/images/emoji/unicode/1f1e7-1f1e7.png">cc:dd<img alt="🇪🇪" class="emoji" src="/images/emoji/unicode/1f1ea-1f1ea.png">ff.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,204.232.175.90' (RSA) to the list of known hosts.
Identity added: /Users/username/.ssh/github_id_rsa (/Users/username/.ssh/github_id_rsa)
PTY allocation request failed on channel 0
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
GithubにSSH公開鍵を設定 初心者Git日記その五~GitHubにSSH公開鍵登録~ Github に SSH 公開鍵を登録する GitHub Help Categories/SSH
2013-12-26 リンク切れの削除と追加
#include <iostream>
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#endif
/*****************************************************
参考URL
http://opencv.jp/opencv2-x-samples/surf_extraction
*****************************************************/
int main(int argc, const char * argv[])
{
/*****カメラからのビデオキャプチャを初期化する*****/
//デフォルトカメラをオープン
cv::VideoCapture cap(0);
//カメラがオープンできない場合終了
if( !cap.isOpened() )
return -1;
//キャプチャ画像を1280*720で取得
cap.set( CV_CAP_PROP_FRAME_HEIGHT, 720 );
cap.set( CV_CAP_PROP_FRAME_WIDTH, 1280 );
/*****ウィンドウを作成する*****/
char windowName[] = "SURF-TEST";
cv::namedWindow( windowName, CV_WINDOW_AUTOSIZE );
//何かキーが押下されるまで、ループをくり返す
while( cvWaitKey( 1 ) == -1 )
{
cv::Mat gray , frame;
cap >> frame; //カメラからキャプチャ
cv::cvtColor( frame , gray , CV_RGB2GRAY ); //キャプチャ画像を処理用にグレースケール変換
/*****SURFクラスの初期化*****/
cv::SURF calc_surf = cv::SURF(500,4,2,true); //拡張ディスクリプタを用い128次元で取得
/*****SURF特徴をグレースケール画像から抽出*****/
std::vector<cv::KeyPoint> kp_vec; //C++の可変長配列(cv::Keypoint型)のベクトル配列を宣言
std::vector<float> desc_vec; //C++の可変長配列(float型)のベクトル配列を宣言
calc_surf( gray , cv::Mat(), kp_vec, desc_vec); //SURFディスクリプタ計算
/*****抽出したSURF特徴の位置とスケールを描画*****/
std::cout << "Image Keypoints: " << kp_vec.size() << std::endl; //標準出力に出力
#if 1
//この辺りちょっとよくわからない
//イテレータを使って???
std::vector<cv::KeyPoint>::iterator it = kp_vec.begin(), it_end = kp_vec.end();
for( ; it!=it_end; it++)
{
//円を描画
cv::circle( frame , /*描画先画像*/
cv::Point(it->pt.x, it->pt.y) , /*中心座標*/
cv::saturate_cast<int>(it->size*0.25) , /*半径*/
cvScalar(255,255,0) /*色*/
);
}
#else
for( int i = 0; i < kp_vec.size(); i++ )
{
KeyPoint* point = &(kp_vec[i]);
Point center; // Key Point's Center
int radius; // Radius of Key Point
center.x = cvRound(point->pt.x);
center.y = cvRound(point->pt.y);
radius = cvRound(point->size*0.25);
circle(colorImage, center, radius, Scalar(255,255,0), 1, 8, 0);
}
#endif
/*****適応的閾値処理による二値化*****/
/*
Mat adaptive_img;
//adaptiveThreshold(gray_img, adaptive_img, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 8);
adaptiveThreshold(gray, adaptive_img, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 6);
*/
//変換画像をウィンドウに表示
imshow( windowName, frame );
}
// ウィンドウを破棄する
cvDestroyWindow( windowName );
return 0;
}