1

我对 Flutter 和 C++ 真的很陌生。所以我正在努力解决这个问题。我想通过 ffi->c++ (opencv) 对图像进行一些转换。这是我在 Flutter 方面的代码:

class Processvalue extends Struct {
  Pointer<Utf8> image;

  factory Processvalue.allocate(Pointer image) =>
      malloc<Processvalue>().ref
        ..image = image;
}

我基本上接受了从 C++ 端返回的指针。然后我像这样调用 C++ 本机函数:

...
final processImage = nativeEdgeDetection
        .lookup<NativeFunction<ProcessImageFunction>>("process_image")
        .asFunction<ProcessImageNativeFunction>();
...

在 C++ 方面,在process_image函数中我使用以下内容:

...
Mat dst = Mat::zeros(maxHeight, maxWidth, CV_8UC1);
Mat transformation_matrix = getPerspectiveTransform(img_pts, dst_pts);
warpPerspective(img, dst, transformation_matrix, dst.size());
uchar * arr = dst.isContinuous()? dst.data: dst.clone().data;

基本上,我通过 ffi 包将图像路径从 Flutter 发送到 C++。并在 C++ 中从该文件中获取图像并创建 opencv Mat 变量dst,它将保存新的转换图像。然后我将此 Mat 变量转换为uchar * arr,我将其返回到 Flutter(指向 arr 的指针)。但是在 Flutter 中,我无法将其转换回图像数据(例如 Uint8List)。

我见过人们使用cv::imwrite(path, dst);将转换直接保存到同一个文件。但对我来说,我想保留原始文件,只想将新图像作为数据返回 Flutter 并通过MemoryImage(...Uint8List variable...).

如何从 C++ 将图像数据发送回 Flutter?最后,我想拥有一个Uint8List. 这uchar * arr甚至是一个不错的选择吗?

我尝试了以下方法,但它给了我一个invalid image data错误:

int imageArrLength = _result.ref.image.length;
                       ^- Pointer back from C++
Uint8List image = _result.ref.image.cast<Uint8>().asTypedList(imageArrLength);
4

0 回答 0