簡體   English   中英

如何將類型T的值分配給uchar類型的data [i]而沒有任何損失?

[英]How to assign a value of type T to data[i] of type uchar without any loss?

腳本

我想創建自己的SetChannel函數,它將設置圖像的特定通道。 例如,我有一個類型為CV_16UC3的圖像input (類型為ushort BGR圖像),我想將綠色通道(由於基於零的索引而= 1)更改為ushort32768 為此,我調用SetChannel(input,1,32768)

template<typename T>
void SetChannel(Mat mat, uint channel, T value)
{
    const uint channels = mat.channels();
    if (channel + 1 > channels)
        return;

    T * data = (T*)mat.data;

// MBPR             : number of Memory Block Per Row
// Mat.step         : number of byte per row
// Mat.elemSize1()  : number of byte per channel
const unsigned int MBPR = mat.step / mat.elemSize1();

// N                : total number of memory blocks
const unsigned int N = mat.rows * MBPR;

for (uint i = channel; i < N; i += channels)
    data[i] = value;

}

我更喜歡在單循環中工作而不是嵌套循環,所以我定義了上面給出的迭代次數N

上面的代碼按預期工作, 其他人說這部分

T * data = (T*)mat.data;

是一種代碼氣味,被認為是一個設計糟糕的程序。

現在我想用另一種方法重寫新的方法,如下所示。 它沒有按預期工作,因為我不知道如何將T value分配給uchar類型的data[i]

template<typename T>
void SetChannel(Mat mat, uint channel, T value)
{
    const uint channels = mat.channels();
    if (channel + 1 > channels)
        return;

    uchar * data = mat.data;


    const unsigned int N = mat.rows * mat.step;// byte per image
    const unsigned int bpc = mat.elemSize1();// byte per channel
    const unsigned int bpp = mat.elemSize(); // byte per pixel
    for (uint i = channel * bpc; i < N; i += bpp)
        //data[i] = value;
}

如何將類型T value賦值給uchar類型的data[i]而沒有任何損失?

對於那些不知道Mat是怎樣的人,以下內容可能會有用。

關於OpenCV Mat

OpenCV提供了許多類型的圖像。 例如,

  • CV_8UC1表示灰度圖像類型,其中每個像素具有一個uchar類型的通道。
  • CV_8UC3表示BGR(非RGB)圖像類型,其中每個像素具有三個通道,每個通道都是uchar類型。
  • CV_16UC3表示BGR(非RGB)圖像類型,其中每個像素具有三個通道,每個通道類型為ushort

  • 等等

Mat是封裝圖像的類。 它有幾個屬性和功能。 讓我列出一些我將在這個問題中使用的內容,以便您更好地理解我的場景。

  • Mat.data :指向圖像像素塊的uchar類型的指針。
  • Mat.rows :行數
  • Mat.channels() :每個像素的通道數
  • Mat.elemSize1() (以1結尾):每個通道的字節數
  • Mat.elemSize() :每像素的字節數。 Mat.elemSize() = Mat.channels() * Mat.elemSize1()
  • Mat.step :每行的字節數

這里Mat.step可以被認為是 - “有效”每行像素數(讓我將其命名為EPPR), - 每個像素的通道數或Mat.channels() ,以及 - 每個通道的字節數或Mat.elemSize1()

在數學上,

 Mat.step = EPPR  * Mat.elemSize() 
 Mat.step = EPPR * Mat.channels() * Mat.elemSize1()

讓我將EPPR * Mat.channels()定義為每行的內存塊( MBPR )。 如果你知道MBPR的正確用語,請告訴我。

因此, MBPR = Mat.step / Mat.elemSize1()

我是從某人離線得到的。 希望它對其他人也有用。

template<typename T>
void SetChannel(Mat mat, uint channel, T value)
{
    const uint channels = mat.channels();
    if (channel + 1 > channels)
        return;


    uchar * data = mat.data;
    const unsigned int N = mat.rows * mat.step;// byte per image
    const unsigned int bpc = mat.elemSize1();// byte per channel
    const unsigned int bpp = mat.elemSize(); // byte per pixel
    const unsigned int bpu = CHAR_BIT * sizeof(uchar);// bits per uchar
    for (uint i = channel * bpc; i < N; i += bpp)
        for (uint j = 0; j < bpc; j++) 
            data[i + j] = value >> bpu * j;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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