[英]CORBA::String_var -> I can't assign any value to class field of this type
[英]How to assign a value of type T to data[i] of type uchar without any loss?
我想創建自己的SetChannel
函數,它將設置圖像的特定通道。 例如,我有一個類型為CV_16UC3
的圖像input
(類型為ushort
BGR圖像),我想將綠色通道(由於基於零的索引而= 1)更改為ushort
值32768
。 為此,我調用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
是怎樣的人,以下內容可能會有用。
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.