この記事は@kjunichiの2017年パーソナルアドベントカレンダーの9日目の記事です 。
背景
OpenCV.jsをブラウザで使う分には、imreadやimwriteがDOM要素をしている実装に なっているので、便利に使えるが、node.jsでサーバサイドやCLIとして使うと、 jsdom+node-canvasでいけるかと思いきや、セグフォしたり、WindowsだとJPEGが 使えるnode-canvasだとjsdomに認識されず辛い状況。
imreadを自前で実装
昔、OpenCVのMatはBGRの順で並んでいた気がしたが、それは WebCamの入力結果がそういう順番なだけなのかも、とりあえず、 RGBの順番で行けた。
const src = new cv.Mat(128,128,cv.CV_8UC3); for(let j = 0; j < 128; j++){ for(let i = 0; i < 32; i++) { src.data[j * src.cols * src.channels() + i * src.channels()]=j*2; src.data[j * src.cols * src.channels() + i * src.channels()+1]=i*64; src.data[j * src.cols * src.channels() + i * src.channels()+2]=i*32; } }