OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
画像の基本操作

目標

  • 画像を読み込む方法と、それをWeb上に表示する方法を学ぶ。

画像を読み込む

OpenCV.jsは画像を cv.Mat 型として保存する。HTMLのcanvas要素を用いて cv.Mat をWebへ転送したり、その逆を行ったりする。ImageDataインターフェースは、canvas要素のある領域の基となるピクセルデータを表現したり設定したりできる。

覚え書き
詳細はcanvasのドキュメントを参照のこと。

まず、canvasからImageDataオブジェクトを作成する:

let canvas = document.getElementById(canvasInputId);
let ctx = canvas.getContext('2d');
let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);

次に、cv.matFromImageData を使って cv.Mat を構築する:

let src = cv.matFromImageData(imgData);
覚え書き
canvasは連続したストレージを持つ8ビットRGBA画像のみをサポートするため、cv.Mat の型は cv.CV_8UC4 になる。これはネイティブのOpenCVとは異なる。ネイティブの imreadimshow で返される・表示される画像はチャンネルがBGRの順で格納されているためである。

画像を表示する

まず、srcの型を cv.CV_8UC4 に変換する:

let dst = new cv.Mat();
// scale and shift are used to map the data to [0, 255].
src.convertTo(dst, cv.CV_8U, scale, shift);
// *** is GRAY, RGB, or RGBA, according to src.channels() is 1, 3 or 4.
cv.cvtColor(dst, dst, cv.COLOR_***2RGBA);

次に、dstから新しいImageDataオブジェクトを生成する:

let imgData = new ImageData(new Uint8ClampedArray(dst.data), dst.cols, dst.rows);

最後に、それを表示する:

let canvas = document.getElementById(canvasOutputId);
let ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
canvas.width = imgData.width;
canvas.height = imgData.height;
ctx.putImageData(imgData, 0, 0);

OpenCV.jsでは

OpenCV.jsは上記の方法を用いて画像の読み込みと表示を実装している。

html canvasまたはimg要素から画像を読み込むには cv.imread (imageSource) を使用する。

引数
imageSourcecanvas要素またはそのid、もしくはimg要素またはそのid。
戻り値
チャンネルがRGBAの順で格納されたmat。

それを表示するには cv.imshow (canvasSource, mat) を使用する。この関数はmatのビット深度に応じて、matをスケーリングすることがある:

  • matが8ビット符号なしの場合、そのまま表示される。
  • matが16ビット符号なしまたは32ビット整数の場合、ピクセルは256で除算される。すなわち、値域 [0,255*256] が [0,255] にマッピングされる。
  • matが32ビット浮動小数点の場合、ピクセル値は255で乗算される。すなわち、値域 [0,1] が [0,255] にマッピングされる。
引数
canvasSourcecanvas要素またはそのid。
mat表示するmat。

上記の画像の読み込みと表示のコードは、以下のように簡略化できる。

let img = cv.imread(imageSource);
cv.imshow(canvasOutput, img);
img.delete();

試してみる