我在我的项目中使用Android的OpenCV处理YUV420(https://wiki.videolan.org/YUV/#NV12)图像。由于该项目的其余部分都在C#中,因此我正在使用GCHandles将字节数组复制到C ++代码。通过对C#和C ++中的所有字节求和并进行比较,我确保了C ++中的数据正常。但是,当我尝试这样做时:
int foo(unsigned char * inputPtr, int width, int height) {
cv::InputArray input_image = cv::Mat(height + height /2, width, CV_8UC1, inputPtr);
int res = 0;
for (int y = 0; y < input_image.rows(); y++) {
for (int x = 0; x < input_image.cols(); x++) {
res += (int)input_image.getMat().ptr(x + y * input_image.cols());
}
}
return res;
}
,每次返回零(C#计数仍返回正确的数字)。返回正确值的所有字节的总和如下所示:
int foo(unsigned char * inputPtr, int width, int height) {
int res = 0;
for (int i = 0; i < width * height * 1.5f; i++) {
res += (int)inputPtr[i];
}
return res;
}
基于以下问题,cv :: Mat()参数应该正确:Converting from YUV colour space to RGB using OpenCV
OpenCV可能出于什么原因决定不从看似有效的数据中创建矩阵?
编辑:忘记添加inputPtr指针指向大小为(int)(camBytes.Width * camBytes.Height * 1.5f)的C#字节[]。
答案 0 :(得分:1)
Ptr返回指针,但没有值。使用at():
res += (int)input_image.getMat().at<uchar>(y, x);