Ошибка. Выражение должно иметь тип класса

0

Я пытаюсь передать Mat на функцию, но у меня возникают некоторые ошибки, когда я пытаюсь получить данные float изображения. Может кто-нибудь просветить меня, что случилось?

int _tmain(int argc, _TCHAR* argv[])
{
    cv::Mat img;//gradients from fingerprint image
    cv::Mat dst;
    bh2Rad(&img,&dst);
}

void bh2Rad(Mat* srcMat,cv::Mat* dstMat)
{
    for (int i=0; i < srcMat->rows ;i++)
    {
        float* srcP = srcMat->data.fl + srcMat->width * i;// srcMat Error.
        float* dstP = dstMat->data.fl + dstMat->width * i;//dstMat Error

        for (int j = 0; j < srcMat->cols ;j++)
            dstP[j] = srcP[j] * BH_DEG_TO_RAD;
    }
}
  • 0
    Вы включили Mat.h ?
  • 0
    Какие ошибки? Где они?
Показать ещё 4 комментария
Теги:
opencv
pointers

2 ответа

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

вы, кажется, путаете старшую (c-api) CvMat с cv :: Mat с пиксельными операциями.

Кроме того, изображение в градациях серого является uchar, а не float, и вы не можете получить доступ к своим пикселям в произвольном формате (если раньше вы не конвертировали float()).

int main(int argc, char* argv[])
{

  cv::Mat img = cv::imread("original.bmp", CV_LOAD_IMAGE_GRAYSCALE);
  cv::Mat dst;

  bh2Rad(img,dst);

}

//
// please use references with cv::Mat, not pointers.
// those things are refcounted, you're thrashing that with passing pointers.
//
void bh2Rad(const cv::Mat & srcMat, cv::Mat & dstMat)
{
  dstMat.create(srcMat.size(),srcMat.type());
  for (int i=0; i < srcMat.rows ;i++)
  {
    const uchar* srcP = srcMat.ptr<uchar>(i);
    uchar* dstP = dstMat.ptr<uchar>(i);

    for (int j = 0; j < srcMat.cols ;j++)
        dstP[j] = srcP[j] * BH_DEG_TO_RAD;
  }
}
  • 0
    Здравствуй. У меня все еще есть ошибки. во-первых, почему const Mat? Кстати, если я изменил const Mat только на Mat, у меня все равно будет ошибка src-> columns и src-> cols
  • 0
    1. показать, что он не модифицирован. 2. о-о-о, плохо, см. Редактировать
Показать ещё 16 комментариев
1

Ошибка указывает единственный экземпляр, где вы не квалифицировали Mat с CV пространства имен. Я предполагаю, что у вас нет директивы use для CV пространства имен, поэтому тип Mat, объявленный только в CV, неизвестен и не распознается.

void bh2Rad(cv::Mat* srcMat, cv::Mat* dstMat)

(обратите внимание на cv :: непосредственно после открытия скобки).

  • 0
    Спасибо, но я уже использовал "использование пространства имен cv" в начале. Извините за путаницу

Ещё вопросы

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