今天不經意發現了一個opencv讀取像素的祕密,哈哈。用不同的方式讀取像素時,對於圖像中指定的一塊區域,垂直掃描與水平掃描方式,黑色像素數因該是一樣的。可是用at方式與ptr方式讀出來的總數居然不一樣。以前一直沒理會,可是看到實驗結果總是差強人意,所以就一直調試,找了昨天一晚上加今天一上午的時間,採用各種方式測試,才發現是工具函數出的問題,具體爲什麼我也沒深究,就拿出來分享一下。
for (int i = 0; i < src.cols; i++)
{
for (int j = center - gap; j <= center + gap; j++)
{
perPixelValue = src.at<uchar>(Point(i,j));
if (perPixelValue == 0)
{
vsumPix += 1;
continue;
}
}
}
cout << "垂直掃描像素數" << vsumPix << endl;
for (int row = center - gap; row < center + gap; row++)
{
for (int col = 0; col < src.cols; col++)
{
perPixelValue = src.at<uchar>(Point(row,col));
if (perPixelValue == 0)
num++;
}
}
cout << "實際總數" <<num << endl;
通過結果發現,區域是一樣的,都用at方式,結果不同。
for (int i = 0; i < src.cols; i++)
{
uchar *data = src.ptr<uchar>(i);
for (int j = center - gap; j <= center + gap; j++)
{
perPixelValue = data[j];
if (perPixelValue == 0)
{
vSum += 1;
}
cout << "垂直掃描像素數" << vSum << endl;
for (int row = center - gap; row < center + gap; row++)
{
for (int col = 0; col < src.cols; col++)
{
perPixelValue = src.at<uchar>(Point(row,col));
if (perPixelValue == 0)
num++;
}
}
cout << "實際總數" <<num << endl;
這個結果是截取寬度爲圖像寬,高度爲給定值的區域進行像素數統計,可以發現結果一樣了。
結論:可能按正常的行列順序掃描,at能行,當遇到其他次序掃描時,還是用指針靠譜。
opencv應用