Точка доступа к пикселям OpenCV и at () - разные значения - PullRequest
0 голосов
/ 11 сентября 2018

Я столкнулся со странным поведением при попытке получить доступ к пикселям, как показано ниже:

void Dbscan::regionQuery(int i, int j, std::vector<Point>* res) const {
// check rect. grid around center point
const size_t row_min = std::max(0, i-eps_);
const size_t row_max = std::min(n_rows_, i+eps_+1);
const size_t col_min = std::max(0, j-eps_);
const size_t col_max = std::min(n_cols_, j+eps_+1);
assert(masked_img_.depth() == CV_8UC1);
for (int m = row_min; m<row_max; ++m) {
    const uchar* mask_ptr = masked_img_.ptr(m);
    for (int n = col_min; n<col_max; ++n) {
        assert(*mask_ptr == masked_img_.at<uchar>(m, n));
        if (masked_img_.at<uchar>(m, n) == 255) {
            res->emplace_back(Point(m,n));
        }
        mask_ptr++;
    }
}

По сути, второе утверждение, как показано, не выполняется, и я довольно не понимаю, что происходит. У кого-нибудь есть идеи, как лучше всего подойти к решению проблемы выше?

С наилучшими пожеланиями

Felix

1 Ответ

0 голосов
/ 11 сентября 2018

cv::Mat::ptr возвращает указатель на начало строки из аргумента, который является адресом элемента в первом столбце этой строки. cv::Mat::at возвращает ссылку на элемент в строке и столбце из аргумента. В вашем коде строка совпадает, а столбец - нет (если ваш col_min не равен 0), поэтому вам нужно переместить указатель из элементов cv::Mat::ptr n, чтобы он соответствовал вашему столбцу:

for (int m = row_min; m<row_max; ++m) {
    const uchar* mask_ptr = masked_img_.ptr(m);
    for (int n = col_min; n<col_max; ++n) {
        assert(*(mask_ptr + n) == masked_img_.at<uchar>(m, n));
        if (masked_img_.at<uchar>(m, n) == 255) {
            res->emplace_back(Point(m,n));
        }
    }
}
...