Вот код, который я запускаю для справки о том, что я собираюсь задать внизу кода:
#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
Проблема заключается в том, что вначале это учащийся, так что да, правильный формат не поможет. В любом случае, если для использования 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 скорее всего выделил пространство для этого типа. Надеюсь, вам повезет.
Кроме того, используйте правильный спецификатор формата:
printf("%hhu\n", cv_Mat_ptr_index(mat, i)[j]) ;
printf("%hhu\n", *( cv_Mat_ptr_index(mat, i)[j]) ) );<-
и когда я запускаю его на месте нижнего cv_Mat_ptr_index
в коде выше. Я получаю "недопустимый аргумент типа унарной" ошибки .... вы знаете, почему это происходит?
Как я вижу, проблема в этой линии
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
принимает тип в качестве третьего аргумента. Должна быть соответствующая функция, которая возвращает тот же тип, поэтому ваша задача - найти эту функцию.