マトリックスのクロッピングの実装には、cropRect がソース イメージのエッジに重ならないようにするアサートがあります。
// Asserts that cropRect fits inside the image's bounds.
cv::Mat croppedImage = image(cropRect);
この制限を解除し、画像の外側にある黒いピクセルを使用してこれを実行できるようにしたいと考えています。これは可能ですか?
答えは次のとおりです。技術的には可能ですが、実際にはやりたくありません。画像の周りに「黒いピクセル」はありません。あなたの「イメージ」は、自分自身にちょうど十分なメモリを割り当てました。それだけです。したがって、割り当てられたメモリ外のピクセルにアクセスしようとすると、ランタイム エラーが発生します。黒いピクセルが必要な場合は、@ffriend が説明した方法で自分で行う必要があります。image(cropRect) は何も割り当てていません。既に存在するメモリへの新しいポインタを作成するだけです。
このクロップがどのように行われるかについてまだ興味がある場合は、OpenCV が次のことを行っています。
// check that cropRect is inside the image
if ((cropRect & Rect(0,0,image.cols,image.rows)) != cropRect)
return -1; // some kind of error notification
// use one of Mat constructors (x, y, width and height are taken from cropRect)
Mat croppedImage(Size(width,height), image.type(), image.ptr(y)+x, image.step);
テストをスキップして初期化に進むこともできますが、前述したように、これは災害の良いレシピです。