2013-05-02 97 views
1

我有一個C++函數可以從別人的C#應用​​程序調用。作爲輸入,我的函數被賦予一個帶符號的短整型數組,它表示的圖像的維度以及爲返回數據分配的內存,即另一個帶符號短整型數組。這將是我的函數的頭:OpenCV cv :: Mat to short *(避免memcpy)

my_function (short* input, int height, int width, short* output) 

在我的功能,我創建一份簡歷::墊從input,像這樣:

cv::Mat mat_in = cv::Mat (height, width, CV_16S, input); 

mat_in,然後轉化爲CV_32F和OpenCV中的cv::bilateralFilter處理。在它返回cv :: Mat mat_out後,我將數據轉換回CV_16SbilateralFilter只接受CV_8UCV_32F)。現在我需要將這個cv::Mat mat_out轉換回一個短整型數組,以便它可以返回到調用函數。這是我的代碼:

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; 
} 

顯然,在某處我需要得到在mat_out_16Soutput數據結束。我的第一次嘗試是返回一個參考:

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

您可以使用此constructormat_out_16S

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 2013-05-02 13:56:53

+0

我跑了代碼,它很好,如果我遇到任何問題,我會在這裏留下更新。 – casper 2013-05-02 14:48:21