在 MATLAB 中,我們可以使用運算子從矩陣中選擇元素:。我們還可以按任何順序選擇元素,例如選擇元素
SubMat = Mat(1:2:end,1:2:end); % Sequential picking in rows and columns
我的問題是我們如何在不顯式回圈的情況下在 OpenCV 中做到這一點Mat?
uj5u.com熱心網友回復:
cv::Mat 包含一些允許提取子墊的功能,該子墊是原始墊的有限視圖。通過視圖,我的意思是記憶體沒有被復制——它仍然指向另一個 Mat 記憶體。有幾種方法 - 都涉及呼叫指定 ROI 的專用運算子():
Mat operator() (const Rect &roi) const;
Mat operator() (const Range *ranges) const;
Mat operator() (const std::vector< Range > &ranges) const;
還有一些方法傳遞 cols 范圍或 rows 范圍:
Mat colRange (int startcol, int endcol) const;
Mat colRange (const Range &r) const;
Mat rowRange (int startrow, int endrow) const;
Mat rowRange (const Range &r) const;
有關更多資訊,請參閱此處
uj5u.com熱心網友回復:
這樣 MATLAB 語法就相當于一個跨步切片。
在 Python 中,這與使用 numpy 相同,因為 numpy 陣列支持跨步。結果將是一個視圖,即需要零復制。
OpenCV 本身不能做這些跨步技巧,因為 cv::Mat 不支持它們(最后我檢查過)。結果必須是副本。
要使用 OpenCV 在 C 中復制此內容,您需要使用cv::warpAffine.
這里有一些 python(對不起,CBA 現在要接觸 C ),它顯示了要做什么:
im = cv.imread(cv.samples.findFile("lena.jpg"))
(height, width) = im.shape[:2]
M = np.zeros((2,3))
M[0,0] = M[1,1] = 1/2 # 2x3 scaling matrix, 1/stride
subsampled = cv.warpAffine(im, M=M, dsize=(width//2, height//2), flags=cv.INTER_NEAREST)
assert (im[0::2, 0::2] == subsampled).all()
如果考慮到前向變換很麻煩,只需定義后向變換(矩陣從輸出索引計算源索引)并通過WARP_INVERSE_MAP.
M = np.zeros((2,3))
M[0,0] = M[1,1] = 2 # stride 2
# M[0,2] = 0 # offset in j/x
# M[1,2] = 0 # offset in i/y
subsampled = cv.warpAffine(im, M=M, dsize=(width//2, height//2), flags=cv.INTER_NEAREST | cv.WARP_INVERSE_MAP)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/421923.html
標籤:
