新しいインタフェースでは,明示的なメモリ解放が不要になっただけではなく,メモリ確保もたびたび自動的に行われます. この章の最初のサンプルでの cvtColor の呼び出し時の動作は,この一例ですが,ここではもう少し詳しく述べます.
Mat() や他の配列クラスは, create メソッドを提供します. このメソッドは,現在確保されている配列が要求されるサイズや型を満たしていない場合にのみ,配列データのための新しいバッファを確保します. 新しいバッファが必要な場合,既に確保されているバッファは解放されます(これを行う興味深い参照カウントの機構については,前のセクションで述べました). そして,必要とされるメモリバッファが既に確保されているかどうかのチェックは非常に高速なので, 出力パラメータとして配列を伴う新しい OpenCV 関数の多くは create メソッドを呼び出します. 自動データ確保 という概念は,このように実装されています.以下に例を示します:
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0);
if(!cap.isOpened()) return -1;
Mat edges;
namedWindow("edges",1);
for(;;)
{
Mat frame;
cap >> frame;
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(30) >= 0) break;
}
return 0;
}
最初のフレームの処理中に行列 edges が確保され,解像度が突然変更されない限り,毎フレームのエッジマップに同じバッファが再利用されます.
多くの場合,出力配列の型やサイズは入力配列の個別の特性から推測できますが,常に可能なわけではありません.このようなレアケースに相当する関数は, resize() のように,出力配列のデータ型かサイズ,あるいはその両方を指定する個別の入力パラメータを引数に取ります.とにかく, mixChannels や RNG::fill などの少数の例外を除けば,新形式の配列処理関数の大部分は,各出力配列毎に create を呼び出します.
この出力配列確保動作は,新しい関数にだけ実装されていることに注意してください.新しい構造を古い OpenCV の関数に渡したい場合,最初に create メソッドを用いて出力配列を確保し, CvMat や IplImage ヘッダを作成してから関数を呼ばなければいけません.