2017-11-19 6 views
1

나는 하나의 이미지를 두 개의 이미지를 opencv로 전달하고 구조체를 반환하는 DLL을 만들었습니다. 하지만 런타임 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() 
    { 


    } 
} 

, 그것은라는 오류가 발생합니다 : 이것은 내가 C++에서 사용되는 코드는

런타임 오류!

프로그램 :

이 응용 프로그램은 비정상적인 방식으로 종료 할 런타임을 요청했습니다. 응용 프로그램 지원 팀에 문의하십시오.

이 코드의 잘못된 점을 알려주세요.

미리 감사드립니다.

업데이트 : @Programmer의 도움으로

나는 calcOpticalFlowPyrLK()를 호출 할 때 코드가 추락지고 있음을 발견했다. 그리고 만약 내가 정확하게 imshow() 함수를 사용하여 이미지를 얻었는지 확인하면, 결과물이 완전한 검은 색 이미지라는 것을 알았습니다.

+1

C# 및 C++ 함수에 주석을 달아야합니다. 두 함수를 모두 빈 함수로 만들고 문제가 있는지 확인하십시오. 문제가 계속 발생하면 C++의 findPose 함수를 void를 반환하여 아무것도 반환하지 않고 충돌이 여전히 발생하고 있는지 확인하십시오. 이를 사용하여 실제로 문제의 원인을 정확히 찾아 낼 수 있습니다. – Programmer

+0

주석 처리 된 경우. 완벽하게 작동하여 생성자에 정의 된대로 0을 반환합니다. – Althaf

+1

계속하십시오. 충돌이있을 때까지 하나씩 주석을 제거하십시오. 그 줄에 주석을 달고 다시 주석 처리를 해제하여 문제가 발생했는지 확인한 다음 충돌을 일으키는 코드 줄을 게시하십시오. – Programmer

답변

0

마지막으로 알아 냈습니다.

예 코드가 제대로 작동했습니다. 내 C++ 코드 또는 C# 코드에 오류가 없습니다. 저를위한 완전한 까만 심상을 초래 한 이유는, 단 하나 실행하는 화합의 측 strat()에있는 나의 dll fuction를 부른다이다. 그래서 내 경우에는 dll에 인수 된 일반적인 첫 번째 이미지가 대부분 검정색 일 것이라는 것을 알았습니다. 이것은 imshow()으로 테스트했을 때 증명되었습니다. 오류가 발생하는 이유는 해당 검은 이미지를 추적 할 피쳐 포인트가없는 calcOpticalFlowPyrLK() 함수에 전달하기 때문입니다.

그래서 나는 진정한 이미지가 피쳐 포인트를 확인하여 코드에 전달되기 전에 획득되었는지를 확인하기 위해 DLL 내부에 다른 함수를 만들었습니다. 같은

뭔가 :

featureDetection(frame_1, points1); 

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

지금 상황이 완벽하게 작동합니다. 이 점을 이해하는 데 도움이 된 @Programmer에게 진심으로 감사드립니다.