ロボットにwebカメラを取り付けるとき、基盤の形状と収めるスペースの都合で、90度傾けることになった。
カメラが90度傾いているので、撮影される画像・映像も当然90度傾く。
MJPG-streamerでストリーミングしたいと思っていたのだけれど、ただ表示させるだけだと映像が横を向く。こまった。
ラズパイ用のカメラモジュールを使用する場合は、オプションで角度の変更ができるみたい。
webカメラにはそういうオプションがなさそうだったので、Javascriptで表示するときに調整した。
webカメラを90度傾けて使うというのはたぶん極めて特殊なケースだし、正直もうやらない気がするけど、肝心なところだけメモ。
var imgUrl = "画像のURL";
var imgWidth = "画像の幅";
var imgHeight = "画像の高さ";
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext('2d');
canvas.width = imgWidth;
canvas.height = imgHeight;
//画像を90度回転させるため、高さと幅を入れ替えて使用する
var rImgWidth = imgHeight;
var rImgHeight = imgWidth;
ctx.rotate(90 * Math.PI / 180);//時計回りに90度回転させる
ctx.drawImage(imgUrl, 0, -rImgWidth, rImgWidth, rImgHeight);
左上の点を軸として指定した角度回転するので、時計回りに回転させた場合は回転後の幅(=回転前の高さ)と同じだけ描画開始位置を右(下)にずらすのがポイント。
CSSのtransform:rotate()で回転させる(追記)
もっと簡単な方法としては、cssでtransform: rotate(90deg);を指定してcanvas要素ごと回転させてしまう方法もある。
しかし、一つのcanvasに描画する画像が複数ある場合、この方法では特定の画像だけを回転させる(画像ごとに角度を変える)ことはできない。
回転させるためのコードはこんな感じ。キャンバスのサイズ比率(横:縦)は回転前が4:3、回転させたあとが3:4の場合。
var canvas = document.getElementById("canvas");
var canvasHeight;
var canvasWidth;
var isPortrait;
// ウィンドウの高さと幅の短い方にキャンバスの大きさを合わせる
if(window.innerWidth < window.innerHeight){
isPortrait = true;
}else{
isPortrait = false;
}
if(isPortrait){// 画面幅<画面高さ
canvasHeight = window.innerWidth;// 90度回転させるため、ウィンドウの幅を回転前のキャンバスの高さとして指定する
canvasWidth = 4*canvasHeight/3;
}else{// 画面幅>画面高さ
canvasWidth = window.innerHeight;// 90度回転させるため、ウィンドウの高さを回転前のキャンバスの幅として指定する
canvasHeight = 3* canvasWidth/4;
}
canvas.width = canvasWidth;
canvas.height = canvasHeight;
canvas.style.transform = 'rotate(90deg)';
canvas.style.transformOrigin = canvasHeight / 2 + "px";
以上。
つづく。