2013-03-29 43 views
1

碼1類型轉換上的OpenCV數據指針

template<typename T> 
inline T* get_pointer(cv::Mat &src, int row) 
{ 
    return src.ptr<T>(row); 
} 

template<typename T> 
inline T* get_pointer(cv::Mat &src, int row, int col) 
{ 
    return get_pointer<T>(src, row) + col * src.channels(); 
} 

template<typename T> 
inline T* get_pointer(cv::Mat &src, int row, int col, int channel) 
{ 
    return get_pointer<T>(src, row, col) + channel; 
} 

碼2

cv::Mat input = //.... 
auto *input_ptr = get_pointer<float>(input, row, col); 
//back to previous row 
input_ptr = reinterpret_cast<float*>(reinterpret_cast<uchar*>(input_ptr) - input.steps); 

他們安全嗎?

+0

1)reinterpret_cast <>永遠不會「安全」。 (2)get_pointer(src,row)中的指針數學對於非字節像素類型將失敗。 (3)你知道cv :: Mat.ptr()方法嗎?我認爲他們做你想做的事 –

+0

關於非字節像素類型,你的意思是像5-6-5(3個16位的通道,看起來像嵌入式設備上的漂亮命令)一些通道。我總是害怕類型在C++上進行轉換,特別是reinterpret轉換,但我不知道其他解決方案可以返回到上一行,如果我想通過指針運算來完成。感謝您的信息.ptr (),我已經改變了實現。 – StereoMatching

+0

5-6-5或16位無符號或浮點數。在用於計算之前,指針數學需要將reinterpret_cast <>應用於數據。我認爲你不應該實現你自己的模板,直接使用cv :: Mat方法。不確定OpenCV如何處理5-6-5,tho。 –

回答

1

爲什麼不使用這個(更短,更安全)的代碼呢?

T *ptr_to_elem = &src.at<T>(row,col)[channel]; 

這也適用於非連續數組。沒有潛在的危險reinterpret_cast<>需要。這裏唯一的安全條件是您知道數據類型T.更安全的版本是當您使用cv::Mat_<T>而不是cv::Mat時,以便在編譯時捕獲錯誤,而不是在運行時崩潰程序。

T *ptr_to_elem = &src(row,col)[channel];