以下是我正在运行的代码,以供我在代码底部提出的问题参考:
#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循环的正上方是我用来添加&#34; data&#34;的内容的包装函数。进入矩阵&#34; mat&#34; 。它被称为cv_Mat_ptr_index。在此行cv_Mat_ptr_index(mat, i)[j] = data[i][j];
,它设置&#34;数据&#34;中的所有数据。进入&#34; mat&#34;。我试图让这一行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]
行打印矩阵,如上所述..我在项目中使用它,我可以&#39 ; t以任何方式更改前2个C包装器。我试图停止使用mat :: at,所以学习如何用这个函数打印矩阵真的会有所帮助。
245
10
255
10
245
255
10
245
答案 0 :(得分:0)
另外,使用正确的格式说明符:
printf("%hhu\n", cv_Mat_ptr_index(mat, i)[j]) ;
答案 1 :(得分: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
函数将一个类型作为其第三个参数。必须有一个相应的函数返回相同的类型,所以你的任务是找到那个函数。
答案 2 :(得分:0)
问题在于它首先是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对象可能为该类型分配了足够的空间。所以希望你能幸运。