OpenCV:cv :: Mat无法从看似有效的数据中创建矩阵

时间:2019-03-30 18:02:52

标签: c# android c++ opencv

我在我的项目中使用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#字节[]。

1 个答案:

答案 0 :(得分:1)

Ptr返回指针,但没有值。使用at():

res += (int)input_image.getMat().at<uchar>(y, x);