这是我正在运行的代码,用于参考我将在代码底部询问的内容:
#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对象可能为该类型分配了足够的空间。希望你能走运。