私はunityからopencvに2つの画像を渡して構造体を返すためにdllを作成しました。しかし、私は実行時のC + +のエラーが発生しています。 これは私がC++で使用されるコードです:画像をunityからopencvに渡す
struct rigidTransform
{
rigidTransform(double eular_angle_x, double eular_angle_y, double eular_angle_z, double eular_dis_x, double eular_dis_y, double eular_dis_z) : Eular_angle_x(eular_angle_x), Eular_angle_y(eular_angle_y), Eular_angle_z(eular_angle_z), Eular_dis_x(eular_dis_x), Eular_dis_y(eular_dis_y), Eular_dis_z(eular_dis_z) {}
double Eular_angle_x;
double Eular_angle_y;
double Eular_angle_z;
double Eular_dis_x;
double Eular_dis_y;
double Eular_dis_z;
};
struct Color32
{
uchar r;
uchar g;
uchar b;
uchar a;
};
extern "C" rigidTransform __declspec(dllexport) __stdcall findPose(Color32* img1, Color32* img2, int width, int height)
{
Mat Img1(height, width, CV_8UC4, img1), Img2(height, width, CV_8UC4, img2);
//my pose estimation code here
return Tr;
}
と団結で使用される私のC#のコードは次のとおりです。
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
public struct regidTransform
{
public double eular_angle_x;
public double eular_angle_y;
public double eular_angle_z;
public double eular_dis_x;
public double eular_dis_y;
public double eular_dis_z;
}
public class UI : MonoBehaviour
{
[DllImport("test2", EntryPoint = "findPose", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern regidTransform findPose(Color32[] img1, Color32[] img2, int width, int height);
public regidTransform results_;
public WebCamTexture webcamTexture;
public Color32[] img1;
public Color32[] img2;
void Start()
{
results_ = new regidTransform();
webcamTexture = new WebCamTexture();
webPlane.GetComponent<MeshRenderer>().material.mainTexture = webcamTexture;
webcamTexture.Play();
if(webcamTexture.isPlaying)
{
img1 = webcamTexture.GetPixels32();
System.Array.Reverse(img1);
img2 = webcamTexture.GetPixels32();
System.Array.Reverse(img2);
unsafe
{
results_ = findPose(img1, img2, webcamTexture.width, webcamTexture.height);
}
}
}
void Update()
{
}
}
私はこのコードを実行すると、それはというエラーがスローされます。
をランタイムエラー!
プログラム:
このアプリケーションは 異常な方法で終了するランタイムを要求しました。アプリケーションサポートチームにお問い合わせください。
このコードで何が間違っているかを教えてください。
ありがとうございます!
更新日:@Programmerの助けを借りて
私はcalcOpticalFlowPyrLK()
を呼び出すときにコードがクラッシュしつつあることがわかりました。そして、画像が正しくimshow()
の機能を使用しているかどうかをチェックしたところ、完全な黒い画像が得られました。
C#関数とC++関数のコメントを開始する必要があります。両方の関数を空の関数にして、問題が存在するかどうかを確認します。問題がまだ残っている場合は、C++の 'findPose'関数を何も返さないvoid関数にして、クラッシュがまだ起きているかどうかを確認してください。これを使用して、実際に問題の原因を突き止めることができます。 – Programmer
コメントアウトされたとき。それはコンストラクタで定義されているように0を返す完全に動作します。 – Althaf
クラッシュが発生するまで1つずつコメントを解除し続けます。その行にコメントを付けてからコメントを外して問題が解決したことを確認し、クラッシュの原因となっているコード行を投稿します。 – Programmer