- ベストアンサー
プログラミングの習得方法
画像処理アルゴリズムを考える仕事をしていますが、プログラミングスキルが足りておらず、思うように試行・検討が進められていないと痛感しております。 プログラミングをどのように身につけていけばよいでしょうか? 使用言語はC++で開発環境はVisual C++.net 2003を使っています。 プログラミングや画像処理の開発・研究に関わっている方のご意見がいただけるとありがたいです。 また、お薦めのWebサイトや本を紹介していただけるのも歓迎です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
補足ありがとうございます。 画像処理やOpenCVについて役立つアドバイスは差し上げられませんが、CG系は多少心得があり、通ずる所もあると思いますので、私なりにアドバイスさせて頂きます。 >しかしいざコーディングとなると、どう組んでいいのか迷ったり想定したように動作しなくて時間ばかりかかってしまい困っています。 プログラミングやアルゴリズムの知識や技術は、どうしても読み書き両方の量をこなす事が必要です。 プログラミングの学習において、私が一番重要だと考えているのは、トライ&エラーをいかに素早く繰り返すかです。 デバッグやテストのためのツールはどの程度扱えていますか? 先ずこうしたツール群や手法を使いこなせるようになるのが一番即効性があるかもしれません。 特に画像処理は、デバッガで数字だけ見ても実際の出力は想像できませんし、かといって最終出力だけではコードフローは解りませんので、多角度的に見れるようになることはかなり重要だと思います。 VisualStudoはかなり高機能なデバッガがありますが、デバッガは実行を止めた時の一面性しか見せてくれません。 古典的なprintfデバッグや、アサーションも未だ重要な手法の一つです。 こうした手法のためのツールとして、VisualC++ではcrtdbg.hで色々なマクロや関数を用意しています。 http://msdn.microsoft.com/ja-jp/library/1666sb98%28v=vs.80%29.aspx printfの代わりとして、_RPTマクロが使えます。(デバッガの出力ウィンドウに出力されます。) OpenCVでも独自にこうしたマクロ群が用意されているようです。 実験的なコードを素早く書くには、テスト画像の読み込みや、出力を面倒見てくれる、スケルトンの存在が欠かせません。 社内でこれらのようなツールが用意されているかもしれません。 ソフトウェア開発手法の参考書として、次の2冊を紹介させて頂きます。 プログラミング作法 http://www.amazon.co.jp/dp/4756136494 コードコンプリート上・下 http://www.amazon.co.jp/dp/489100455X http://www.amazon.co.jp/dp/4891004568 もう一つ、コードの写経も意外に有効です。 これは私の経験則ですが、最初は丁寧に理屈を理解するよりも、動くコードのパターンを蓄積した方が結果的に学習が早かったりします。 数式や言葉だと全く意味不明でも、コード書いて動かしてみると、なんだこんな簡単なことを言っていただけだったのか、という経験が多々あります。 サンプルコードが多めの画像処理本を1冊探してみるといいかもしれません。 数学については、スネークやオプティカルフローをスクラッチから実装できる技術が必要とされるのであれば、やはり苦手とは言ってられないと思いますが、ひとまずOpenCVへ渡すためのパラメータを作ったり、意味を理解するところで躓いてないのでしたらそれほど気にする必要はないかもしれません。 もしやり直すのであれば、「プログラマのための線形代数」という本はオススメです。 http://www.amazon.co.jp/dp/4274065782 最後に、本の読み方についてですが、1冊をまるまる全て理解するには誰でも相当な時間がかかります。 内容や目的にもよりますが、斜め読みでも構わないので、沢山目を通すのも一つの方法です。 中身は完全に頭に入って無くても、実際に問題に遭遇したとき、「そういえばあの本で似たような話があったような…」みたいな索引として働きます。 以上、長くなりましたが一つでも参考になれば幸いです。
その他の回答 (2)
- axsies
- ベストアンサー率64% (38/59)
初めに、画像処理に関わっている者ではありませんがご容赦ください。 一口にプログラミングスキルが足りないと言っても、言語そのもので躓いてるのか、画像処理技術の知識が足りないと感じているのか、実装技術なのか、等でアドバイスは変わってきます。 もう少し具体的に、 ・どのような職種(医療系?映像メディア系?組み込み系?) ・実務はどんな環境なのか(OpenCVのようなライブラリを使ったコーディングがメイン?、スクラッチから組まなければならない?) ・現在のスキルの程(大学で専攻していた?全くの門外漢?C++なら出来る?) のような情報がないと適切なアドバイスを受けるのは難しいと思います。 画像処理技術を俯瞰するなら、CG-ARTS協会が出している、CG検定の公式テキストが一番良いと思います。 ディジタル画像処理 http://www.amazon.co.jp/dp/4903474011/ 一つ一つの内容は薄いので、もっと詳細が知りたい場合は検索したり、論文を漁ります。 図書館でチラ見した程度で、内容はあんまり覚えてないのですが 詳解 画像処理プログラミング C言語で実装する画像処理アルゴリズムのすべて http://www.amazon.co.jp/dp/4797344377 という本もあります。 後は数学、ですね。。。 画像処理(CGでもそうですが)やる上で、微分方程式と線形代数については大なり小なり、避けられない面があると思います。 もう一つの壁は、アーキテクチャや最適化の知識でしょうか。 これも、大規模なデータ処理という点から避けては通れないと思いますが、質問文からはアドバイス出来かねます。
補足
丁寧なご回答・ご指摘ありがとうございます。 説明が不足していたところがありすみません。ご指摘いただいた点について補足させていただきます。 ・職種は医療系となります。 ・OpenCV使っています。画像の読み込み・書き出し、ライブラリの機能もある程度使っています。 しかし、開発においてそのまま適用して終わりというわけにはいかないので、画素値をunsigned charなどの配列に格納しなおして、自分で各処理についてコーディングできるくらい理解して、試行・改良していく必要があります。 ・情報工学を大学で学んでおり、Cの基本は知っております。 しかしいざコーディングとなると、どう組んでいいのか迷ったり想定したように動作しなくて時間ばかりかかってしまい困っています。 ご紹介いただいたCG-ARTSの「ディジタル画像処理」の本は持っております。私も画像処理技術の概要は把握を把握するのに良いテキストだと思います。 しかし、いざ実装となるとスネーク(動的輪郭)などの領域抽出、オプティカルフローなどの画像間マッチング、などいろいろつまづいてしまい困っています。 アルゴリズムを考えるには、やはり数学力が不足しているのでしょうか・・・ 昔からどうも数学は苦手でして、論文などに微分方程式や行列計算が入ってきたときにその部分の意図していることがイメージできなかったり、画像情報に対してどのように適用されるのかがわからなかったりします。 大規模データ処理の高速化のためのアーキテクチャや最適化については、現在のところ私のほうで考えなくてもよい状態です。 さらにアドバイスをいただけると幸いです。
- im_not_ok
- ベストアンサー率25% (3/12)
画像処理アルゴリズムということなので、とりあえず OpenCV 関連を2冊。 詳解 OpenCV —コンピュータビジョンライブラリを使った画像処理・認識 http://www.amazon.co.jp/exec/obidos/ASIN/4873114136/64-46546-22/ OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応 http://www.amazon.co.jp/exec/obidos/ASIN/4839941262/64-46546-22/ C++ は Standard で、以下2冊。 ストラウストラップのプログラミング入門 http://www.amazon.co.jp/exec/obidos/ASIN/4798119598/64-46546-22/ Accelerated C++—効率的なプログラミングのための新しい定跡 http://www.amazon.co.jp/exec/obidos/ASIN/4894714221/64-46546-22/ Visual C++ だと、以下の1冊とかで、どうでしょか? 速効解決!逆引きハンドブックVisual C++ http://www.amazon.co.jp/exec/obidos/ASIN/488337534X/64-46546-22/
お礼
書籍のご紹介ありがとうございます。 C++ Standardについての本は、かなりボリュームがありそうですね。やはりこのくらいの本を読みこなすと実力がアップするのでしょうか。 本屋で書籍を見てみようと思います。仕事があるので頭から全て読んでいく時間をとることはできそうにありません。どのようなスタイルで読んでいくのがよいかアドバイスをいただけるとさらに助かります。
お礼
丁寧なアドバイスをいただけたことに感激しております。ありがとうございます! 私の足りない部分に対して的確に意見を示していただいていると感じます。 下記ご指摘のことは、今まさに私に必要なことだと思います。実際にどこで間違えたかを把握するのに苦労しており、なかなか前に進めていないと感じております。恥ずかしながら、Visual Studioのデバッガもブレークポイントの使用とステップ実行くらいしか使えておりません。その他のVisual StudioやOpen CVのデバッグやテストーツールについて知っておりませんでした。 >プログラミングの学習において、私が一番重要だと考えているのは、トライ&エラーをいかに素早く繰り返すかです。 >特に画像処理は、デバッガで数字だけ見ても実際の出力は想像できませんし、かといって最終出力だけではコードフローは解りませんので、多角度的に見れるようになることはかなり重要だと思います。 教えていただいた良書にも目を通してみたいと思います。 アドバイスしていただいたことをもとに書くこと・読むことを強化し、もっとスピードアップできるようになりたいです。