讀取圖像中部分區域像素時應注意的問題

今天不經意發現了一個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應用

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章