我有這部分代碼在 C 中作業
Mat mapFrame5(Size(321,262), CV_16UC2);
for (int y = 0; y < mapFrame5.rows; y ) {
for (int x = 0; x < mapFrame5.cols; x ) {
mapFrame5.at<Vec2w>(y, x) = Vec2w(y, x);
cout<<mapFrame5.at<Vec2w>(y,x);
}
}
我很難找到 Python 中是否存在與此運算式等效的運算式:
mapFrame5.at<Vec2w>(y, x) = Vec2w(y, x);
我按照建議嘗試了以下操作:
testArr2 = np.zeros([262,321], np.uint16)
y,yy = 0,0
byteCount = 0
while yy < 262:
x,xx = 0,0
while xx < 321:
testArr2[yy,xx] = [yy,xx]
xx =1
x =1
byteCount =1
yy =1
y =1
但它只給了我這個錯誤:
builtins.TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'
為了清楚起見,我試圖將 y,x 值保存到小端二進制檔案中。
例子:
y = 0
0 0 0 1 0 2 0 3 ... 0 320
y = 261
261 0 261 1 261 2 ... 261 320
C 檔案給了我 336408 位元組
uj5u.com熱心網友回復:
天真的方法是將演算法轉錄為 Python:
def gen_grid_1(rows, cols):
result = np.zeros((rows, cols, 2), np.uint16)
for r in range(rows):
for c in range(cols):
result[r,c,:] = [r, c]
return result
3 行 5 列的示例輸出:
[[[0 0]
[0 1]
[0 2]
[0 3]
[0 4]]
[[1 0]
[1 1]
[1 2]
[1 3]
[1 4]]
[[2 0]
[2 1]
[2 2]
[2 3]
[2 4]]]
但是,這種方法有一個嚴重的缺點——由于 Python 解釋器的開銷,它會非常慢——對于您的示例 321x262 陣列,這幾乎需要 1 秒才能完成。
更好的方法是重申演算法的目標,并使用 Numpy 提供的優化函式重新實作。
我們要生成的是一個 2 通道的 16 位無符號整數陣列,其中每個元素的第一個通道保存其行索引,第二個通道保存列索引。
這聽起來非常接近numpy.meshgrid函式的作用:“從坐標向量回傳坐標矩陣”。
唯一的問題是它回傳 2 個單獨的陣列。我們可以簡單地使用numpy.dstack將它們與所需順序的通道合二為一。
def gen_grid_2(rows, cols):
cc, rr = np.meshgrid(np.arange(cols, dtype=np.uint16), np.arange(rows, dtype=np.uint16))
return np.dstack([rr,cc])
這個函式的輸出與第一個相同,但它運行大約。2 毫秒(即比簡單方法快約 500 倍)。
帶有時序比較的完整腳本:
import numpy as np
ROWS = 262
COLS = 321
def gen_grid_1(rows, cols):
result = np.zeros((rows, cols, 2), np.uint16)
for r in range(rows):
for c in range(cols):
result[r,c,:] = [r, c]
return result
def gen_grid_2(rows, cols):
cc, rr = np.meshgrid(np.arange(cols, dtype=np.uint16), np.arange(rows, dtype=np.uint16))
return np.dstack([rr,cc])
assert(np.array_equal(gen_grid_1(ROWS, COLS), gen_grid_2(ROWS, COLS)))
import timeit
print(timeit.timeit('r1 = gen_grid_1(ROWS, COLS)'
, number=10
, setup="from __main__ import gen_grid_1, ROWS, COLS"))
print(timeit.timeit('r1 = gen_grid_2(ROWS, COLS)'
, number=10
, setup="from __main__ import gen_grid_2, ROWS, COLS"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/369814.html
標籤:Python C 麻木的 opencv opencv-python
下一篇:用遞增序列填充連續的零序列
