読者です 読者をやめる 読者になる 読者になる

プログ

’14修了無内定理系院卒の活動雑記||プー太郎ログ||プログラミング雑記

最後のウルトラC

月末です,公開します.

http://www55.atpages.jp/triplog/pg/monthly/1405/

今月は先月に比べ倍近くの時間がとれた(?)のでマシな出来になったと思います.一つ残念なのは画像処理で一番扱いたかった透視投影変換を諦めてしまったことだけど,終盤になっちゃってたから仕方ないっちゃ仕方ない.


タイトルは最後の最後に思いついた,できることを5倍くらい拡張できる機能「重ねる」.その名の通り画像を重ねる機能で,現在の画像に親ウィンドウから呼び出した画像を重ねる.これにより今まで1つしか描画できなかった幾何図形を組み合わせることができるように.

function cvSuperimpose(){
  if(!window.opener||window.opener.closed){
    window.alert('no parent window');
    return 'no parent window';
  }
  else{
    var tempImg = window.opener.document.getElementById("srcImg");
    document.getElementById("tempImage").src = tempImg.toDataURL();
    //canvas→iplImage
    var newIplImage = cvGetIplImageAtImg("tempImage");
    //背景が透明でない場合は反映
    if(tempImg.style.backgroundColor==="rgb(255, 255, 255)"||tempImg.style.backgroundColor==="rgb(0, 0, 0)"){
      var bg = cvCreateImage(tempImg.width, tempImg.height);
      var bw = (tempImg.style.backgroundColor==="rgb(0, 0, 0)")?0:255;
      for(var i=0;i<tempImg.width*tempImg.height*CHANNELS;i+=CHANNELS){
        bg.RGBA[i]=bw; bg.RGBA[i+1]=bw; bg.RGBA[i+2]=bw; bg.RGBA[i+3]=255;
      }
      cvMixIplImages(bg, newIplImage, newIplImage, 1.0);
    }
    cvMixIplImages(newIplImage, iplImage, newIplImage, 0.5);
    cvShowImage("srcImage", newIplImage);
    document.getElementById("tempImage").src = "";
  }
}

tempImage の CSS を visibility:hidden や display:none にしても一時保存した画像が表示されてしまうため,最後の最後に src="" としています.迷いどことしては重ねるときの合わせ方で,現状は半々としました.多分自然なのは第4引数を1にする(=上層に表示される側を完全に優先する)方法だと思うけど,それだと上層側の背景が塗り潰されている時に処理がうまく行ってないように見える可能性があるのと,半々でしか表現できないことがあるように考えられたためこっちに.重ねる機能をもっと早く思いついていれば,もっとバリエーション豊かに設定できるようにしといたのになってのが少し心残り.

来月ですが Java を扱ってAndroidアプリを作れればと思います.Java自体はPHPJavaScriptに比べると過去にしっかり学んだはずなんだけど,あまり覚えておらず,かつAndroidアプリを開発するのは初めてのためほとんどまっさらの状態からになるはず.とりあえず最初は開発環境の構築とHello worldを済ませて,軌道に乗ってきたら以前貰ったSDKを利用したアプリを作っていこうと思います.