首頁 > 後端開發 > C++ > 如何存取 OpenCV Mat 影像中特定像素的通道值?

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

Patricia Arquette
發布: 2024-11-15 13:04:02
原創
850 人瀏覽過

How do I access the channel value of a specific pixel in an OpenCV Mat image?

如何在 OpenCV 中從 Mat 影像檢索像素通道值

使用 OpenCV 時,存取特定像素的通道值對於影像處理任務至關重要。本文解決了一個常見問題:「如何取得特定像素的通道值?」

假設Mat 物件foo 表示的圖像是常用的8 位元每個通道(CV_8UC3) 格式,取得通道值需要以下內容步驟:

for(int i = 0; i < foo.rows; i++)
{
    for(int j = 0; j < foo.cols; j++)
    {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);

        // Process B, G, and R values here...
    }
}
登入後複製

在此程式碼中,Vec3b 表示一個3 通道向量,其中每個通道對應於藍色、綠色和紅色( BGR) 值。

效能最佳化:

出於效能原因,直接存取資料緩衝區可能是首選:

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

        // Process B, G, and R values here...
    }
}
登入後複製

或者,可以使用基於行的存取:

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

        // Process B, G, and R values here...
    }
}
登入後複製

透過遵循這些方法,您可以有效地檢索各種影像處理任務的各個像素的通道值在OpenCV 中。

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

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