Я пишу C-оболочку для некоторого кода OpenCV C++, и у меня есть 2 функции, которые я использую для создания объекта Mat и задают ему данные cv_create_Mat_type и cv_Mat_ptr_index соответственно. Функции такие, какими они должны быть, я не могу их изменить, потому что есть часть проекта, над которым я работаю с кем-то.
Мой вопрос заключается в том, как напечатать матрицу, заполняемую cv_Mat_ptr_index, поскольку она заполняет ее внутри цикла for. Возвращение на cv_Mat_ptr_index - это uchar * Я попытался разыменовать его, но мне нужно знать, как получить данные внутри возврата cv_Mat_ptr_index, uchar *, потому что я уверен, и исправьте меня, если я ошибаюсь, что это содержит элемент, который в настоящее время выделяется в матричный мат из массива данных в приведенном ниже коде.
Заранее благодарю за любых участников.
#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( )
{
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];
}
Редактировать:
Я пытаюсь в основном распечатать матрицу с помощью cv_Mat_ptr_index, надеюсь, пока она установит данные в матрицу "mat", но если я не могу этого сделать, я надеялся, что вы сможете показать мне, как использовать cv_Mat_ptr_index для печати содержимого матрицы "mat" "
i/e, как cout << mat;
как обычно, но я не могу использовать cout << mat;
потому что это указатель.
Я также надеялся, что вы можете показать мне, как напечатать элемент "mat" с ним, потому что он уже имеет доступ к объекту ptr... Я не могу изменить cv_Mat_ptr_index, хотя...
Mat::ptr(i)
дает указатель на i
й элемент в матрице, рассматриваемый как длинный одномерный вектор.
Mat::at<double>(i,0)
дает ссылку на 0-й элемент i
й строки матрицы, который рассматривается как 2D-матрица как нормальный, поэтому вы можете взять его адрес.
double* cv_Mat_ptr_index(Mat* self, int i) {
return &self->at<double>(i,0);
}
Не забудьте разыграть указатель, который вы возвращаете из cv_Mat_ptr_index(...)
когда вы его назначаете, например
*cv_Mat_ptr_index(mat, i)[j] = data[i][j];
// ^-- note dereference