다른 사람의 C# 응용 프로그램에서 호출 할 C++ 함수가 있습니다. 입력으로 my 함수에는 부호가있는 짧은 정수의 배열, 표현하는 이미지의 크기 및 반환되는 데이터에 할당 된 메모리, 즉 서명 된 정수의 배열이 제공됩니다. 나는이 같은 input
에서 이력서 :: 매트를 만들어 내 함수 내에서OpenCV cv :: short * (memcpy 사용 안 함)
my_function (short* input, int height, int width, short* output)
:
cv::Mat mat_in = cv::Mat (height, width, CV_16S, input);
이 mat_in
다음 CV_32F
로 변환을 OpenCV의 cv::bilateralFilter
에 의해 처리되는이 내 함수의 헤더를 나타낼 것이다. cv :: Mat mat_out을 반환 한 후 데이터를 CV_16S
으로 다시 변환합니다 (bilateralFilter
은 CV_8U
및 CV_32F
만 허용). 이제 호출 함수에 반환 될 수 있도록이 cv::Mat mat_out
을 짧은 정수의 배열로 변환해야합니다. 내가 output
에 mat_out_16S
에있는 데이터를 얻을 필요가 마지막에 어딘가에,
my_function (short* input, int height, int width, short* output)
{
Mat mat_in_16S = Mat (height, width, CV_16S, input);
Mat mat_in_32F = Mat (height, width, CV_32F);
Mat mat_out_CV_32F = Mat (height, width, CV_32F);
mat_in_16S.convertTo (mat_in_32F, CV_32F);
bilateralFilter (mat_in_32F, mat_out_32F, 5, 160, 2);
Mat mat_out_16S = Mat (mat_in_16S.size(), mat_in_16S.type());
mat_out_32F.convertTo (mat_out_16S, CV_16S);
return 0;
}
분명히이 내 코드입니다. 내 첫 번째 시도는 참조를 반환했습니다 :
output = &mat_out_16S.at<short>(0,0);
하지만 물론 내가 mat_out_16S
공허함을 가리키는 output
를 떠나, 함수가 반환하는 즉시 범위를 벗어나으로이 바보 같은 생각 이었다는 것을 깨달았다. 현재 최선 시도 (this question에서) 다음과 같다 :
memcpy ((short*)output, (short*)mat_out_16S.data, height*width*sizeof(short));
지금 내가 알고 싶습니다 더 좋은 방법이 있나요? 이 모든 데이터를 복사하는 것이 비효율적이라고 느끼지만, 내가 할 수있는 다른 것을 볼 수 없습니다. 불행히도 cv :: Mat 반환 할 수 없습니다. 더 좋은 방법이 없다면 적어도 현재의 memcpy
방법은 안전한가요? 내 데이터는 모두 2 바이트 부호있는 짧은 정수이므로 패딩에 문제가 있다고 생각하지 않지만 불쾌한 놀라움에 빠지기를 원하지는 않습니다.
아주 멋진! 감사! – casper
코드를 실행했는데 문제가 생겨서 여기에서 업데이트를 남겨두면 괜찮습니다. – casper