首頁 > 後端開發 > C++ > 主體

如何在 OpenCV 中存取 Mat 影像中的像素通道值?

DDD
發布: 2024-11-25 01:46:14
原創
134 人瀏覽過

How do you access pixel channel values in a Mat image in OpenCV?

在 OpenCV 中從 Mat 影像中提取像素通道值

在 OpenCV 中,有多種方法可以存取和操作 Mat 影像中的像素值。常見的場景是檢索特定像素的通道值。

使用 Vec3b

如果圖像以 CV_8UC3 格式存儲,它表示具有 8 位元無符號整數的三通道圖像值 (BGR),您可以使用 Vec3b 資料類型來存取各個通道。例如,如果foo 是這種類型的Mat 影像,您可以使用以下程式碼迭代像素:

for (int i = 0; i < foo.rows; i++)
{
    for (int j = 0; j < foo.cols; j++)
    {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);
        
        // Access the pixel's BGR values...
    }
}
登入後複製

使用直接資料緩衝區存取

出於效能原因,您可以也可以透過存取資料緩衝區直接存取像素值。這提供了更快的訪問,但需要更多的手動處理資料轉換和通道偏移。以下是如何執行此操作的範例:

uint8_t* pixelPtr = (uint8_t*)foo.data;
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for (int i = 0; i < foo.rows; i++)
{
    for (int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B
        bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G
        bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R
        
        // Access the pixel's BGR values...
    }
}
登入後複製

或者,您也可以使用row() 方法存取影像的各個行,如下所示程式碼:

int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for (int i = 0; i < foo.rows; i++)
{
    uint8_t* rowPtr = foo.row(i);
    for (int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
        bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
        bgrPixel.val[2] = rowPtr[j*cn + 2]; // R

        // Access the pixel's BGR values...
    }
}
登入後複製

請記住,OpenCV 以BGR 格式(藍色、綠色、紅色)而不是RGB儲存像素值,因此您需要存取頻道時要注意這一點。

以上是如何在 OpenCV 中存取 Mat 影像中的像素通道值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板