簡體   English   中英

如何在Mat變量中編輯/讀取OpenCv中的像素值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM