Article header library 130121  1

[画像合成ソフト製作] 第5話 独自機能-モザイク加工にチャレンジ-

こんにちは、MIYA です。
前回の、[画像合成ソフト製作] 第4話 独自機能-色補正にチャレンジ- では独自機能である画像の色補正を実現させました。

今回は前回に引き続き独自機能にチャレンジしていきたいと思います!

独自機能のアイデア-その2-

前回、画像の色補正の他にも独自機能のアイデアをいくつか出しました。

  • 画像の上下反転
  • 画像の拡大・縮小
  • 画像の回転

しかしどれもあまり面白みがないなーと感じていました。
何か他にいいアイデアは無いかなと考えていたときに、私の教育担当者が不意に「モザイク加工とか面白そうだけどね」と言ってきました。

それだ!

そのアイデアいただきました。
ということで、写真をモザイク加工することができるプログラムを作成していきます。

とは言ってもモザイク加工のアルゴリズムなんて知らないので、実現方法を調べてみることにしました。

ビットマップ画像はピクセルの集合体になっていることは 第1話 で説明しました。
今回用いる方法は、このピクセルをいくつかでまとめて、まとめた部分の色を平均の色にします。これをビットマップ画像全体におこなうことでモザイク加工できるという方法です。

この平均の色にする範囲が大きければ大きいほど粗くモザイクがかかり、小さくするほど細かくモザイクがかかります。以下ではこの範囲を「モザイクの粗さ」と呼びます。

Article header library 130121 pic01  1

モザイク加工の方法

早速やってみます。

仕様書作成

まずは基本設計。

Article header library 130121 pic02  1

「合成+モザイク加工」の基本設計

次にフローチャート。

Article header library 130121 pic03  1

「合成+モザイク加工」のフローチャート

今回は、フローチャートを完成させるのにものすごく時間がかかりました。
モザイク加工の実現方法はわかっていても、それをどのように実装するのかを考えながら作成するのは本当に大変でした・・・
ここは何度も先輩とレビューをしたポイントですね。

コーディング

では、作成したフローチャートに基づいてコーディングしていきます。

Article header library 130121 pic04  1

「合成+モザイク加工」のコード

ここもなかなか苦労しましたが完成です。

実行

今回も、毎度お馴染みのフレーム画像と写真を用意します。

Article header library 130121 pic05  1

フレーム画像と写真

Cygwinツール上で下記のように記入して実行します。

Article header library 130121 pic06  1

Cygwin画面



・・・しかし

Article header library 130121 pic07  1

Cygwin画面(エラー表示)

なんだこれは。
コアダンプだと!?

コアダンプとは?

  • 致命的なエラーが発生した際に出力されるエラー
  • 主に見てはいけないメモリ領域を参照したときによく起こる

ふむふむ。
さっぱりです。

デバッグする

まずはどこでエラーが発生しているのか知る必要があります。
そこで用いたのが

printfデバッグ

どういうものかと言うと、ソースコードの適当な位置に例えば

printf(“Check”);

と書いて実行します。
「Check」が画面に表示されれば問題はそのprintf文以降、表示されなければそのprintf文以前にあることがわかります!

Article header library 130121 pic08  1

printfデバッグの例

というわけでさっそくやっていきたいと思います!
今回は printf(“Check1”) と printf(“Check2”) の2つを適当な位置に書いて、エラー箇所を探していきます。

Article header library 130121 pic09  2

printfデバッグの結果

何度か試すと上記の画像のとき、Check1が表示されたのにCheck2が表示されませんでした。
つまり問題は、この間にあることがわかりました。

で、エラーが起きている場所は絞ることができたのですが・・・

なんでエラーなのか全くわからない

助けて先輩

このままでは本当にどうしようもないので、先輩に助けを求めました。

書いたソースコートを見てもらうと、「画像サイズをモザイクの粗さで割ったときに、割り切れない場合考えてる?」と一言。

あ!わかった気がします!!!

原因は確保していないメモリを読み込んでしまったこと

どういうことか説明します。

今回、メモリは画像データサイズ分のみ確保していることに注意してください。下記にモザイク加工の手順を示します。

① 「モザイクの粗さ」を設定
② 確保したメモリの画像データから「モザイクの粗さ」分のデータを読み込む
③ 読み込んだデータを平均の色にする
④ ② ③を繰り返す

このとき、「モザイクの粗さ」が確保したメモリの画像データサイズを割り切れる値でないと、確保していないメモリまで読み込んでしまうことになります。

これが原因でした!

Article header library 130121 pic10  1

エラーの例

じゃあどうする!?

原因がわかればあとは簡単です。
確保していないメモリまで読み込んでしまうのならば、読み込まないようにすればいいだけです!

つまり、余った部分はモザイク加工しないということです。

Article header library 130121 pic11  1

エラー回避の例

ということで、少しだけコードを修正します。

Article header library 130121 pic12  1

コード修正

再度実行

原因も明らかになり、コードも修正できたところで再度実行したいと思います。

またまたCygwinツール上で下記のように記入します。

Article header library 130121 pic06  2

Cygwin画面



実行!







どーーーーん!!


Article header library 130121 pic13  1

「合成+モザイク加工」写真

Awesome!!!

思わずAwesomeが出てしまいました。
すばらしい!ほんとに嬉しいです!
ここまでやってきてよかった・・・

最後に

とうとう製作実習を終えました。
この約2ヶ月間は本当に苦しかった半面、すごく成長できたなと思います。
C言語のプログラミングのスキルはもちろんですが、一番成長できたなと思うのは気持ちです。

実習を通して常に意識していたことは「どうやったらその問題を解決できるか」です。これは私の教育担当に毎日のように言われていた言葉です。

エンジニアはサポートもしなければならないし、日々問題に直面します。その中で「できない・わからない」は当たり前だから、どうやったら「できる・わかるようになる」かを考えて取り組むことが大切だと教えていただきました。

今後は、実習で学んだこの教訓を活かして日々の業務を取り組んでいきたいと思います。

これにてMIYAのブログを終えさせていただきたいと思います。
最後まで読んでくださりありがとうございました。




2018年度 翔け新人!エンジニア奮闘記はこちら

翔け新人!エンジニア奮闘記とは?

マクニカのエンジニアが新人時代に研修中に感じた疑問、制作実習での奮闘、発生したトラブルを解決するまでのフローなど紹介します。個性あふれる新人たちが奮闘から会得した実用的なノウハウを業務にご活用ください。

翔け新人!エンジニア奮闘記 著者紹介はこちら

関連タグ