需要帮助解引用这个uchar*来打印它的内容

Need help dereferencing this uchar* to print its contents

本文关键字:打印 uchar 帮助 引用      更新时间:2023-10-16

这是我正在运行的代码,用于参考我将在代码底部询问的内容:

#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("%in",  cv_Mat_ptr_index(mat, i)[j]);}}
}

在for循环的正上方是我用来将"data"的内容添加到矩阵"mat"中的包装器函数。它被称为cv_Mat_ptr_index。在cv_Mat_ptr_index(mat, i)[j] = data[i][j];这行,它将"data"中的所有数据设置为"mat"。我试图让这行printf("%in", cv_Mat_ptr_index(mat, i)[j])将数据的内容打印为4x2矩阵,即这正是:

501 10255年10501 255501

,但我能得到的最好的是下面。我尝试改变for循环结束括号的位置。试着用%i, %s,%u打电话,因为号码错了…我改变了第二个cv_Mat_ptr_index ` line by taking off the [j] ',它将该行更改为uchar*输出,因此我可以使用u%。尝试使用cout.

. .我可以继续下去,但是我可以使用一点帮助,让printf("%in", cv_Mat_ptr_index(mat, i)[j]行像上面一样打印矩阵。我在一个项目中使用这个,我不能以任何方式改变前2 C包装。我试着停止使用mat::at,所以学习如何用这个函数打印矩阵会很有帮助。

245 10 255 10 245 255 10 245

在我看来,问题出在这一行

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函数将类型作为其第三个参数。必须有一个对应的函数返回相同的类型,所以您的任务是找到该函数。

同时,使用正确的格式说明符:

  printf("%hhun", cv_Mat_ptr_index(mat, i)[j]) ;

问题是它首先是uchar,所以是的,正确的格式不会有帮助。无论如何,如果有cv_create_Mat_typed使用CV_64F,也许有一个相关的

 cv_Mat_ptr_index_cv_64f(Mat *self, int i)

如果你没有找到,我认为,作为最后的手段,你可以尝试将它转换为*float

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

我没有尝试运行或编译这个,所以它可能有拼写错误。关键是,原始Mat对象可能为该类型分配了足够的空间。希望你能走运。