나는 하나의 이미지를 두 개의 이미지를 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()
함수를 사용하여 이미지를 얻었는지 확인하면, 결과물이 완전한 검은 색 이미지라는 것을 알았습니다.
C# 및 C++ 함수에 주석을 달아야합니다. 두 함수를 모두 빈 함수로 만들고 문제가 있는지 확인하십시오. 문제가 계속 발생하면 C++의 findPose 함수를 void를 반환하여 아무것도 반환하지 않고 충돌이 여전히 발생하고 있는지 확인하십시오. 이를 사용하여 실제로 문제의 원인을 정확히 찾아 낼 수 있습니다. – Programmer
주석 처리 된 경우. 완벽하게 작동하여 생성자에 정의 된대로 0을 반환합니다. – Althaf
계속하십시오. 충돌이있을 때까지 하나씩 주석을 제거하십시오. 그 줄에 주석을 달고 다시 주석 처리를 해제하여 문제가 발생했는지 확인한 다음 충돌을 일으키는 코드 줄을 게시하십시오. – Programmer