Пытаясь найти изображение Magnitude of Mat

Я пытаюсь изучить OpenCV (с использованием версии 3.0.0).
Прямо сейчас я пытаюсь увидеть, как точечные операции делают с различными изображениями, все идет хорошо, пока я не попытался выполнить операцию величины, которая требует, чтобы входные данные были в форме

magnitude(InputArray x, InputArray y, OutputArray magnitude)

Также описывается, что x и y должны быть массивами с плавающей точкой x / y-координат векторов, а также одинакового размера.

Я попытался создать вектор матов и разделить входное изображение на эти векторы, а затем использовал для них оператор величины, но это не сработало. Поэтому я думаю, что мне нужно передать аргументы в виде столбцов и строк, но теперь я получаю сообщение об ошибке

    OpenCV Error: Assertion failed (src1.size() == src2.size() && type == src2.type() && (depth == CV_32F || depth == CV_64F)) in magnitude, file /home/<user>/opencv-3.0.0-beta/modules/core/src/mathfuncs.cpp, line 521
terminate called after throwing an instance of 'cv::Exception'
what():  /home/<user>/opencv-3.0.0-beta/modules/core/src/mathfuncs.cpp:521: error: (-215) src1.size() == src2.size() && type == src2.type() && (depth == CV_32F || depth == CV_64F) in function magnitude

Aborted (core dumped)

И я не уверен почему, потому что я явно конвертирую входные Mats в типы CV_64F.
Я неправильно использую функцию величины? Или просто передать неверные данные?

void Magnitude(Mat img, Mat out)
{

img.convertTo(img, CV_64F);
out.convertTo(out, CV_64F);

for(int i = 0 ; i < img.rows ; i ++)
for(int j = 0 ; j < img.cols ; j++)
cv::magnitude(img.row(i), img.col(j), out.at<cv::Vec2f>(i,j));

cv::normalize(out,out,0,255,cv::NORM_MINMAX);
cv::convertScaleAbs(out,out);
cv::imshow("Magnitude", out);

waitKey();
}

1

Решение

void magnitude(InputArray x, InputArray y, OutputArray magnitude)

где x, y а также magnitude должен иметь одинаковый размер. В вашем случае это означает, что ваше изображение должно быть квадратичным. Это правильно?

Пример использования:

cv::Sobel(img, gx, img.depth(), 1, 0, 3);
cv::Sobel(img, gy, img.depth(), 0, 1, 3);

cv::Mat mag(gx.size(), gx.type());
cv::magnitude(gx, gy, mag);
3

Другие решения


По вопросам рекламы [email protected]