ниже - фрагмент из учебника SVM opencv по этой ссылке. И в этом фрагменте находится эта строка кода "Mat sampleMat = (Mat_ (1,2) << j, i); '. Вместо использования шаблона Mat_ мне нужно будет использовать обычный объект Mat. Я надеялся, что кто-то покажет мне, как преобразовать Mat_ в Mat в предыдущей строке.
Я попробовал Mat sampleMat = (Mat(1,2, CV_32FC1) << j,i);
//но получить длинную страницу ошибок, которые я пробовал. Mat sampleMat = Mat(1,2, CV_32FC1) << j,i;
// то же, длинная страница ошибок
Мне просто нужен код по ссылке в верхней части страницы, чтобы работать без использования Mat_ и использовать только Mat на своем месте... если кто-то может показать мне, как написать эту строку, я бы ее оценил.
for (int i = 0; i < image.rows; ++i)
for (int j = 0; j < image.cols; ++j)
{
Mat sampleMat = (Mat_<float>(1,2) << j,i);
float response = SVM.predict(sampleMat);
if (response == 1)
image.at<Vec3b>(i,j) = green;
else if (response == -1)
image.at<Vec3b>(i,j) = blue;
}
Изменение: попытка запустить, как показано ниже, но получить ошибки
Vec3b green(0,255,0), blue (255,0,0);
// Show the decision regions given by the SVM
for (int i = 0; i < image.rows; ++i)
for (int j = 0; j < image.cols; ++j)
{
Mat sampleMat(1, 2, CV_32F);
float * const pmat = sampleMat.ptr<float>();
pmat[0] = i;
pmat[1] = j;
float response = SVM.predict(sampleMat);
if (response == 1)
pmat[0] = green;
pmat[1] = green;
else if (response == -1)
pmat[0] = blue;
pmat[1] = blue;
}
Я понял, что вы бы достаточно знали, поэтому мне не нужны ошибки =)
Задайте значения непосредственно:
Mat sampleMat(1, 2, CV_32F);
sampleMat.at<float>(0,1) = j;
sampleMat.at<float>(0,2) = i;
или
Mat sampleMat(1, 2, CV_32F);
float * const pmat = sampleMat.ptr<float>();
pmat[0] = j;
pmat[1] = i;
Приложение:
Увидев ваш цикл, вы можете сделать его более эффективным в том случае, если SVM.predict
не изменяет sampleMat
. Вы можете установить строку изображения только один раз за строку, а не делать это все время:
for (int i = 0; i < image.rows; ++i)
{
Mat sampleMat(1, 2, CV_32F);
sampleMat.at<float>(0, 2) = i;
for (int j = 0; j < image.cols; ++j)
{
sampleMat.at<float>(0, 1) = j;
...
}
}