【问题标题】:Need help dereferencing this uchar* to print its contents需要帮助取消引用此 uchar* 以打印其内容
【发布时间】:2016-05-19 12:11:20
【问题描述】:

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

#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 循环的正上方是我用来将“data”的内容添加到矩阵“mat”中的包装函数。它被称为 cv_Mat_ptr_index。在这一行cv_Mat_ptr_index(mat, i)[j] = data[i][j]; 它将“data”中的所有数据设置为“mat”。我试图让这条线printf("%i\n", cv_Mat_ptr_index(mat, i)[j]) 将数据的内容打印为 4x2 矩阵,即这正是:

501 10 255 10 501 255 10 501

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

..我可以继续下去,但我可以使用一些帮助来获取printf("%i\n", cv_Mat_ptr_index(mat, i)[j] 行来打印上面的矩阵..我在一个项目中使用它,我无法更改前 2 个C 包装器以任何方式。我正在尝试停止使用 mat::at,因此学习如何使用此函数打印矩阵会很有帮助。

245 10 255 10 245 255 10 245

【问题讨论】:

  • 在该代码中的某处,您将数组的每个元素转换为无符号字符。 unsigned char 只能表示 0 到 255 之间的数字。当您将 501 分配给 unsigned char 时,结果数字是 245。
  • @user3386109 感谢您的加入,你能帮我让它做我想做的事吗..即使我找到了 uchar 它仍然只打印 5 个数字...cv_Mat_ptr_index 是一个 uchar*返回。
  • 评论太多了,所以我发布了一个答案。

标签: c++ opencv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    另外,使用正确的格式说明符:

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

    【讨论】:

    • 感谢您的回复...我注意到您的代码中有一个额外的括号 printf("%hhu\n", *( cv_Mat_ptr_index(mat, i)[j]) ) );&lt;-,当我运行它时,它代替了上面代码中较低的 cv_Mat_ptr_index。我收到“无效的一元类型参数”错误......你知道它为什么会这样吗?
    • 我没有注意到它已经被取消引用了,我的错。无论如何,hhu 是 unsigned char 的正确格式说明符。 %i 需要更宽的 int,因此 printf 无法使用它。
    • 哦,等一下,现在我在您的原始代码中看到您正在尝试打印浮点数,但在此之前将其转换为 uchar。正如@user3411335 注意到的那样,它不会像这样工作。让我谷歌这个图书馆。它叫 OpenCV,对吧?
    • 这是您在这里使用的ptr 吗? docs.opencv.org/modules/core/doc/…
    • 某处不是还有另一个 cv_Mat_ptr_index 包装函数吗?可能类似于 cv_Mat_ptr_index_typed,您可以在其中提供参数 CV_64F,就像使用 create 一样?
    【解决方案3】:

    问题在于它首先是 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("%f\n",  ( (float*)cv_Mat_ptr_index(mat, i)[j] ) );
    

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

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 2013-06-17
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      相关资源
      最近更新 更多