我进行这样的操作:image_backup_.at<Vec3b>(xpos + i, ypos + j - 1)[k]就会终止程序,然后debug下发现call stack:定位到上一行image_backup_.at<Vec3b>(xpos + i, ypos + j - 1)[k]和CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
image_backup_.at<Vec3b>(xpos + i, ypos + j - 1)[k]
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
光阴似箭催人老,日月如移越少年。
at 関数のパラメーターは、x、y ではなく、at (行、列) であるため、範囲外エラーが発生し、この 2 つを置き換える必要があります。 x と y を使用する必要がある場合は、at(cv::Point(x,y)) を使用できます。 さらに、opencv は例外をスローします。catch(std::Exception e) を使用して例外をキャッチし、エラー情報を表示できます。
at という名前の関数には通常、境界チェックがあります。ここでのチェックはアサーション、つまり CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); を通じて実装されます。式のセマンティクスによれば、アサーションが失敗する理由は、座標が「i>=size」の範囲外であることです。
xpos + iとypos + j - 1の値の範囲を確認してください。注:チェック時の符号なし変換のため、0未満の値はより大きな値となります。
xpos + i
ypos + j - 1
at 関数のパラメーターは、x、y ではなく、at (行、列) であるため、範囲外エラーが発生し、この 2 つを置き換える必要があります。
x と y を使用する必要がある場合は、at(cv::Point(x,y)) を使用できます。
さらに、opencv は例外をスローします。catch(std::Exception e) を使用して例外をキャッチし、エラー情報を表示できます。
at という名前の関数には通常、境界チェックがあります。ここでのチェックはアサーション、つまり
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
を通じて実装されます。式のセマンティクスによれば、アサーションが失敗する理由は、座標が「i>=size」の範囲外であることです。xpos + i
とypos + j - 1
の値の範囲を確認してください。注:チェック時の符号なし変換のため、0未満の値はより大きな値となります。