Нужна помощь в разыменовании этого uchar * для печати его содержимого

0

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

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/highgui/highgui_c.h"
#include <iostream>
using namespace cv;
using namespace std;

uchar* cv_Mat_ptr_index(Mat* self, int i) {
    return self->ptr(i);
}

Mat* cv_create_Mat_typed(int rows, int cols, int type) {
    return new Mat(rows, cols, type);
}

int main(  )
{ uchar a;

float data[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
Mat* mat = cv_create_Mat_typed(4, 2, CV_64F);
 for(int i = 0; i < 4; i++){
   for(int j = 0; j < 2; j++){
     cv_Mat_ptr_index(mat, i)[j] = data[i][j];

     printf("%i\n",  cv_Mat_ptr_index(mat, i)[j]);}}
}

Прямо над этим в цикле for используется функция-оболочка, которую я использую для добавления содержимого "данных" в матричный "мат". Он называется cv_Mat_ptr_index. На этой строке cv_Mat_ptr_index(mat, i)[j] = data[i][j]; он устанавливает все данные в "данных" в "мат". Я пытаюсь получить эту строку printf("%i\n", cv_Mat_ptr_index(mat, i)[j]) чтобы напечатать содержимое данных как матрицу 4x2, то есть это точно:

501 10 255 10 501 255 10 501

но лучшее, что я мог получить, было ниже. Я попытался изменить расположение концевых скобок для петель. попробовал вызов с% i,% s,% u, потому что числа были неправильными... Я изменил строку 2 cv_Mat_ptr_index ' line by taking off the [j] ', который изменил эту строку на выход uchar *, чтобы я мог использовать au%. Пробовал использовать cout.

Я мог бы продолжать и продолжать, но я мог бы немного помочь получить printf("%i\n", cv_Mat_ptr_index(mat, i)[j] чтобы напечатать матрицу, как указано выше. Я использую эту в проекте, и я никак не могу изменить верхние оболочки C C. Я пытаюсь прекратить использовать mat :: at столько же, поэтому научиться печатать матрицу с помощью этой функции действительно поможет.

245 10 255 10 245 255 10 245

  • 0
    Где-то в этом коде вы конвертируете каждый элемент массива в беззнаковый символ. Символ без знака может представлять только числа от 0 до 255. Если назначить 501 символу без знака, полученное число будет 245.
Показать ещё 2 комментария
Теги:
opencv

3 ответа

0

Проблема заключается в том, что вначале это учащийся, так что да, правильный формат не поможет. В любом случае, если для использования CV_64F существует cv_create_Mat_typed, возможно, существует связанный

 cv_Mat_ptr_index_cv_64f(Mat *self, int i)

если вы не обнаружите, что я думаю, в крайнем случае вы можете попробовать сделать это на * float

 ((float*) cv_Mat_ptr_index(mat, i)[j] ) = data[i][j];
 printf("%f\n",  ( (float*)cv_Mat_ptr_index(mat, i)[j] ) );

Я не пытался запускать или компилировать это, поэтому он может иметь опечатки. Дело в том, что исходный объект Mat скорее всего выделил пространство для этого типа. Надеюсь, вам повезет.

0

Кроме того, используйте правильный спецификатор формата:

  printf("%hhu\n", cv_Mat_ptr_index(mat, i)[j]) ;
  • 0
    Я ценю ваш ответ ... Я заметил, что в вашем коде есть дополнительные скобки printf("%hhu\n", *( cv_Mat_ptr_index(mat, i)[j]) ) );<- и когда я запускаю его на месте нижнего cv_Mat_ptr_index в коде выше. Я получаю "недопустимый аргумент типа унарной" ошибки .... вы знаете, почему это происходит?
  • 0
    Я не заметил, что это уже достаточно разыменовано, мой плохой. В любом случае, hhu - правильный формат для неподписанного символа. % Я ожидаю, что int, который шире, поэтому printf не может с этим работать.
Показать ещё 4 комментария
0

Как я вижу, проблема в этой линии

cv_Mat_ptr_index(mat, i)[j] = data[i][j];

Поскольку cv_Mat_ptr_index(mat, i) возвращает uchar * что эквивалентно

uchar *mptr = cv_Mat_ptr_index(mat, i);
mptr[j] = data[i][j];

В процессе data[i][j] преобразуются в uchar, что означает, что данные могут находиться только в диапазоне от 0 до 255. Обратите внимание, что все числа, находящиеся в этом диапазоне, работают правильно. Единственное число за пределами этого диапазона - 501, которое преобразуется в 245.

Я не знаком с семейством функций cv_Mat, но вижу, что функция cv_create_Mat_typed принимает тип в качестве третьего аргумента. Должна быть соответствующая функция, которая возвращает тот же тип, поэтому ваша задача - найти эту функцию.

Ещё вопросы

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