15

Opencv が cv::Point が cv::Mat 内にあるかどうかを確認する機能を提供しているかどうかは誰にもわかりませんか?

基本的に私はやっています:

int x = (current.x - offset);
int y = current.y;
if (x >= 0 && y >= 0 && x < mat.cols &&  y < mat.rows) && ((int)mat.at<uchar>(y, x) == 0)){
        return cv::Point(x, y);
    }
}

もっと速いものがあるかどうか知りたいですか?または、これを行うのが悪い場合は?

4

1 に答える 1

22

cv::Rectサイズの を として構築し、cv::Matそのcontains()メソッドを使用できます。

cv::Rect rect(cv::Point(), mat.size());
cv::Point p(x, y);

if (rect.contains(p) && mat.at<uchar>(y, x) == 0)
{
  return p;
}

at()または、インデックスが範囲外の場合に例外をキャッチできます。

UPD:コメントで @Antonio が適切に述べているように、「パフォーマンスを向上させるために、インデックス範囲チェックはデバッグ構成でのみ実行される」ため、以下はデバッグ モードでのみ機能します。これは驚くべきことであり、異なります。std::vector::at()働き方から。

try
{
  if (mat.at<uchar>(y, x) == 0)
  {
    return cv::Point(x, y);
  }
}
catch (cv::Exception& e)
{
}

ただし、例外によってパフォーマンスが低下する可能性があることに注意してください。このステートメントがループで実行される場合、または非常に頻繁に実行される場合は、後者のアプローチを使用しないでください。または、例外的な状況ではなく通常の場合。

于 2013-06-21T13:25:19.713 に答える