我对 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);