2017-11-19 9 views
1

私は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()の機能を使用しているかどうかをチェックしたところ、完全な黒い画像が得られました。

+1

C#関数とC++関数のコメントを開始する必要があります。両方の関数を空の関数にして、問題が存在するかどうかを確認します。問題がまだ残っている場合は、C++の 'findPose'関数を何も返さないvoid関数にして、クラッシュがまだ起きているかどうかを確認してください。これを使用して、実際に問題の原因を突き止めることができます。 – Programmer

+0

コメントアウトされたとき。それはコンストラクタで定義されているように0を返す完全に動作します。 – Althaf

+1

クラッシュが発生するまで1つずつコメントを解除し続けます。その行にコメントを付けてからコメントを外して問題が解決したことを確認し、クラッシュの原因となっているコード行を投稿します。 – Programmer

答えて

0

最後に私はそれを理解しました。

はい、コードはうまくいきました。私のC++コードやC#コードにエラーはありません。私のために完全な黒のイメージをもたらした理由は、私は一度だけ実行する統一の機能のstrat()の横に私のDLLのfuctionを呼び出します。だから、私の場合、典型的な1番目の画像はdllに取得されたものがほとんど黒いものであることがわかりました。これはdllの中でimshow()の機能をテストしたときに証明されたものです。それがエラーを投げる理由は、その黒い画像を追跡する特徴点を持たないcalcOpticalFlowPyrLK()関数に渡しているからです。

dllの中に別の関数を作成して、本当の画像が取得されてからコードに渡すかどうかを確認しました。

ような何か:

featureDetection(frame_1, points1); 

if (points1.size() > MIN_NUM_FEATURES) 
{ 
    //Pass the frame to my code. 
} 

今物事が完璧に動作します。私がこれを理解するのを助けた@Programmerに心から感謝します。

関連する問題