我有一個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_16S
(bilateralFilter
只接受CV_8U
和CV_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_16S
爲output
數據結束。我的第一次嘗試是返回一個參考:
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 2013-05-02 13:56:53
我跑了代碼,它很好,如果我遇到任何問題,我會在這裏留下更新。 – casper 2013-05-02 14:48:21