Почему я получаю это ^ @, когда я пытаюсь получить доступ к первому элементу члена структуры данных CvMat

0

когда я запускаю этот код

      double a[]={1.0,2.0,3.0,4.0};
      CvMat M=cvMat(8,8,CV_8UC1, a);
      cout<<"M.data.ptr="<< M.data.ptr[0]<<endl;

для доступа к 1.0, первому элементу матрицы, я получаю вывод M.data.ptr=^@ как ни странно, я попытался скопировать вывод cout в это? и ^@ не будет копировать.. я получил только M.data.ptr когда я M.data.ptr... Я связал другие варианты, такие как M.data.ptr[0] и M.data.ptr но получил нормальную ошибку и null выход для этих 2 соответственно. как бы я хотел получить доступ к 1.0, разыменовывая элемент структуры данных, а не используя функцию i/e cvGet2D... на всякий случай, если ее emacs, который делает это, я думал, что я сообщаю im, используя Emacs на Ubuntu Saucy...

Теги:
opencv

2 ответа

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

Вы пытаетесь инициализировать матрицу с элементами типа double, но создаете матрицу типа CV_8UC1. Кроме того, прямой доступ к указателю возвращает исходный указатель (типа unsigned char) на базовые данные. Вы должны интерпретировать этот указатель как double* для получения фактических значений. То, что вы пытаетесь сделать, может выглядеть примерно так:

double a[]={1.0,2.0,3.0,4.0};
CvMat M = cvMat(8,8,CV_64FC1, a);

double* data_ptr_64f = (double*)(M.data.ptr);

cout<<"M.data.ptr="<< data_ptr_64f[0]<<endl;
  • 0
    Большое спасибо, что отлично ответил на мой вопрос
1

Вы не читаете правильное количество байтов. Поле data имеет размер 8 бит (uchar). Вы должны либо наложить указатель:

cout << *((double *)M.data.ptr) << endl;

или используйте получатели, которые OpenCV любезно предоставит вам:

cout << M.at<double>(0, 0) << endl;

/* yet another possibility */
cout << *M.ptr<double>(0) << endl;

Ещё вопросы

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