2013-05-02 4 views
1

다른 사람의 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으로 다시 변환합니다 (bilateralFilterCV_8UCV_32F 만 허용). 이제 호출 함수에 반환 될 수 있도록이 cv::Mat mat_out을 짧은 정수의 배열로 변환해야합니다. 내가 outputmat_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 바이트 부호있는 짧은 정수이므로 패딩에 문제가 있다고 생각하지 않지만 불쾌한 놀라움에 빠지기를 원하지는 않습니다.

답변

1

당신은 당신의 mat_out_16Sconstructor를 사용할 수 있습니다

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP) 

그래서 함수가 될 것입니다 :

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(), output); 
    mat_out_32F.convertTo (mat_out_16S, CV_16S); 

    return 0; 
} 
+0

아주 멋진! 감사! – casper

+0

코드를 실행했는데 문제가 생겨서 여기에서 업데이트를 남겨두면 괜찮습니다. – casper