Ошибка значения матрицы в opencv C ++ с mat.at <uchar>(i, j) - PullRequest
0 голосов
/ 21 июня 2020

Я изучаю обработку изображений с помощью OpenCV на C ++. Чтобы реализовать базовый c алгоритм понижающей дискретизации, мне нужно поработать на уровне пикселей - удалить строки и столбцы. Однако, когда я присваиваю значения с помощью mat.at <> (i, j), назначаются другие значения - например, 1e-38.

Вот код:

Mat src, dst;
src = imread("diw3.jpg", CV_32F);//src is a 479x359 grayscale image

//dst will contain src low-pass-filtered I checked by displaying it works fine
Mat kernel;
kernel = Mat::ones(3, 3, CV_32F) / (float)(9);
filter2D(src, dst, -1, kernel, Point(-1, -1), 0, BORDER_DEFAULT);

// Now I try to remove half the rows/columns result is stored in downsampled
    Mat downsampled = Mat::zeros(240, 180, CV_32F);
for (int i =0; i<downsampled.rows; i ++){
    for (int j=0; j<downsampled.cols; j ++){
        downsampled.at<uchar>(i,j) = dst.at<uchar>(2*i,2*j);
    }
}

Поскольку я читайте здесь OpenCV выводит нечетные значения пикселей , которые мне нужно было преобразовать для cout, я написал downsampled.at<uchar>(i,j) = (int) before dst.at<uchar>, но он также не работает.

1 Ответ

0 голосов
/ 21 июня 2020

Второй аргумент для cv::imread - cv :: ImreadModes , поэтому строка:

src = imread("diw3.jpg", CV_32F);

неверна; вероятно, это должно быть:

cv::Mat src_8u = imread("diw3.jpg", cv::IMREAD_GRAYSCALE);
src_8u.convertTo(src, CV_32FC1);

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

l oop должно выглядеть примерно так это:

Mat downsampled = Mat::zeros(240, 180, CV_32FC1);
for (int i = 0; i < downsampled.rows; i++) {
  for (int j = 0; j < downsampled.cols; j++) {
    downsampled.at<float>(i,j) = dst.at<float>(2*i,2*j);
  }
}

обратите внимание, что аргумент для cv::Mat::zeros равен CV_32FC1 (1 канал, с 32-битными плавающими значениями), поэтому следует использовать метод Mat::at<float>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...