[英]How to edit/read pixel values in OpenCv from Mat variable?
我正在尋找一種從Mat(或Mat3b)變量編輯/讀取像素的有效方法。
我用過 :-
Image.at<Vec3b>(i,j)
但它似乎很慢。
我也用過這個: -
A.data[A.channels()*A.cols*i + j + 0]
但我面臨的問題是當我運行這個循環時
for(i=0; j<A.rows; i++){
for(j=0; j<A.cols; j++){
A.data[A.channels()*A.cols*i + j + 0] = 0;
A.data[A.channels()*A.cols*i + j + 1] = 0;
A.data[A.channels()*A.cols*i + j + 2] = 0;
}
}
只有一部分圖像變黑了。
在這里,您可以看到快速元素訪問的一些可能性。
但是如果你想按自己的方式去做,你需要添加一個括號。 否則你的索引計算不正確:
for(int i=0; i<A.rows; i++){
for(int j=0; j<A.cols; j++){
A.data[A.channels()*(A.cols*i + j) + 0] = 0;
A.data[A.channels()*(A.cols*i + j) + 1] = 0;
A.data[A.channels()*(A.cols*i + j) + 2] = 0;
}
}
但是由於填充,不能保證存儲器的布局是連續的。 所以根據這個你應該使用這樣的公式:
for(int i=0; i<A.rows; i++){
for(int j=0; j<A.cols; j++){
A.data[A.step[0]*i + A.step[1]* j + 0] = 0;
A.data[A.step[0]*i + A.step[1]* j + 1] = 0;
A.data[A.step[0]*i + A.step[1]* j + 2] = 0;
}
}
這是從cv :: Mat編輯/讀取像素的最有效方法之一。 創建指向行的指針(如果需要,可以指定特定通道)
for(int i=0; i<A.rows;i++){
uchar* rowi = A.ptr/*<uchar>*/(i);
for(int j=0; j<A.cols; j++){
doProcessOnPixel(rowi[j]);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.