Как я могу преобразовать Mat_ в Mat в следующем коде?

0

ниже - фрагмент из учебника 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;
    }

Я понял, что вы бы достаточно знали, поэтому мне не нужны ошибки =)

Теги:
opencv

1 ответ

0
Лучший ответ

Задайте значения непосредственно:

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;
    ...
  }
}
  • 0
    Спасибо, что ответили мне так скоро, я надеялся использовать << для назначения данных, если это невозможно, есть ли способ показать мне, как назначить данные с помощью объекта Mat.ptr в этом случае ... I пытаюсь держаться подальше от Mat.at, потому что я слышал, что это медленно ....
  • 0
    Mat.at работает медленно в режиме отладки, потому что там выполняется проверка границ. но молниеносно в выпуске. так что не бойтесь использовать его!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню