Я пытаюсь обработать снимок, который я делаю с C # в OpenCV.
Для этого мне нужно конвертировать из формата Unitys Texture2D (в данном случае это RGBA32) в OpenCV's Mat.
My C # Code
unsafe{
Color32[] textureDataColor = MLCamera.PreviewTexture2D.GetPixels32();
fixed (Color32* p = textureDataColor){
log("Detected Markers: " + Interop.Detect((IntPtr)p, MLCamera.PreviewTexture2D.width, MLCamera.PreviewTexture2D.height));
}
}
My Interop
[DllImport("ml_aruco_api")]
internal static extern int Detect(IntPtr textureData, int width, int height);
И мой код C ++
extern "C" int Detect(unsigned char* textureData, int width, int height) {
MDetector.setDictionary(Dictionary::ARUCO_MIP_36h12);
Mat image(height, width, CV_8UC4, textureData);
Mat img;
cvtColor(image, img, COLOR_RGBA2BGR);
vector<Marker> Markers = MDetector.detect(img);
imwrite("/documents/C2/pic.jpg", img);//for debugging
return Markers.size();
}
Полученный файл pic.jpg будет серого цвета. Что я делаю неправильно?
RGBA32 означает 4 канала, 8 бит, и я думаю, что OpenCV работает в BGR? Без использования cvtColor программа просто вылетает.