2013-06-05 99 views
0

我想知道OpenCV中是否有任何函數,它與STL中的兩個cv::Mat對象一起使用std::tranform類似於OpenCV中cv :: Mat的std :: transform函數

例如,

cv::transform(src1, src2, dst, bin_function); 

其中

  • src1src2:輸入矩陣的大小相同(CV :: MAT)。
  • dst:與輸入相同的輸出矩陣。
  • bin_function:接受兩個元素作爲參數(兩個矩陣中的每一個)的二元函數或函數對象,並返回一些結果值。

我試圖在文檔中搜索,但沒有找到這樣的東西。

回答

6

據我所知在OpenCV中沒有這樣的功能呢。但是,您可以在cv::Mat迭代器像這樣使用STL算法std::transform

std::transform(src1.begin<float>(), src1.end<float>(), 
       src2.begin<float>(), dest.begin<float>(), bin_function); 

一定要使用正確的模板類型參數。因此,如果您有一個3通道矩陣,例如每個通道8位,則使用Vec3b而不是float

雖然小心通常的STL陷阱。 src1,src2dest在呼叫std::transform之前應具有相同數量的元素。如果你需要這種通用性,你可以考慮自己編寫一個包裝函數cv::transform,它會檢查這個函數,爲dest保留內存。動態查找模板參數的正確類型可能會很困難,因爲bin_function需要接受所有可能的參數。但是,即使是在某些特定情況下也可以,如果使用帶有auto參數的C++ 14 lambda表達式。

+0

工作正常。僅供參考,在我的OpenCV版本(2.4.9)中,不需要指定迭代器類型(函數begin和end不是模板)。 – brotherofken

+0

那麼,那會更好。真棒! –

+0

@brotherofken什麼?如何在運行時確定'cv :: Mat'的類型,然後才能恰當地輸入它們?也許你正在使用'cv :: Mat_ '? –