Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+的实验室转换+;_C++_Operators - Fatal编程技术网

C++ 使用C+的实验室转换+;

C++ 使用C+的实验室转换+;,c++,operators,C++,Operators,我使用这个函数将图像的RGB颜色转换为实验室空间。我不理解第13、14和15行,因为它们使用特殊符号(>>)和十六进制数: void RGB2LAB( const vector<uint> & ubuff, vector<double>& lvec, vector<double>& avec, vector<do

我使用这个函数将图像的RGB颜色转换为实验室空间。我不理解第13、14和15行,因为它们使用特殊符号(>>)和十六进制数:

void RGB2LAB(
    const vector<uint> &             ubuff,
    vector<double>&                 lvec,
    vector<double>&                 avec,
    vector<double>&                 bvec)
{
    int sz = int(ubuff.size());

    lvec.resize(sz);
    avec.resize(sz);
    bvec.resize(sz);

    for( int j = 0; j < sz; j++ )
    {
        int sR = (ubuff[j]>> 16) & 0xFF;   //<----
        int sG = (ubuff[j] >>  8) & 0xFF;  //<----
        int sB = (ubuff[j]  ) & 0xFF;      //<----
        //------------------------
        // sRGB to XYZ conversion
        // (D65 illuminant assumption)
        //------------------------
        double R = sR/255.0;
        double G = sG/255.0;
        double B = sB/255.0;

        double r, g, b;

        if(R <= 0.04045)    r = R/12.92;
        else                r = pow((R+0.055)/1.055,2.4);
        if(G <= 0.04045)    g = G/12.92;
        else                g = pow((G+0.055)/1.055,2.4);
        if(B <= 0.04045)    b = B/12.92;
        else                b = pow((B+0.055)/1.055,2.4);

        double X = r*0.4124564 + g*0.3575761 + b*0.1804375;
        double Y = r*0.2126729 + g*0.7151522 + b*0.0721750;
        double Z = r*0.0193339 + g*0.1191920 + b*0.9503041;
        //------------------------
        // XYZ to LAB conversion
        //------------------------
        double epsilon = 0.008856;  //actual CIE standard
        double kappa   = 903.3;     //actual CIE standard

        double Xr = 0.950456;   //reference white
        double Yr = 1.0;        //reference white
        double Zr = 1.088754;   //reference white

        double xr = X/Xr;
        double yr = Y/Yr;
        double zr = Z/Zr;

        double fx, fy, fz;
        if(xr > epsilon)    fx = pow(xr, 1.0/3.0);
        else                fx = (kappa*xr + 16.0)/116.0;
        if(yr > epsilon)    fy = pow(yr, 1.0/3.0);
        else                fy = (kappa*yr + 16.0)/116.0;
        if(zr > epsilon)    fz = pow(zr, 1.0/3.0);
        else                fz = (kappa*zr + 16.0)/116.0;

        lvec[j] = 116.0*fy-16.0;
        avec[j] = 500.0*(fx-fy);
        bvec[j] = 200.0*(fy-fz);
    }




}
void RGB2LAB(
常量向量和ubuff,
向量&lvec,
vector&avec,
向量机(bvec)
{
intsz=int(ubuff.size());
左室射血分数(sz);
avec.resize(sz);
bvec.resize(sz);
对于(int j=0;j>16)&0xFF;//>8)&0xFF;//让我们将其分解:

ubuff
是一个
uint
-s的向量。每个
uint
由32位(可能是64位,但对于本解释并不重要)或4字节组成

因此,单个值,例如
ubuff[j]
在内存中看起来如下:

|-- Byte1 --|-- Byte2 --|-- Byte3 --|-- Byte4 --|
现在我们已经解决了这个问题,让我们讨论一下操作符
>
。这是右移操作符,它的作用是将内存中的位向右旋转。例如:

ubuff[j] >> 8 // ==> |-- ByteX --|-- Byte1 --|-- Byte2 --|-- Byte3 --|
(ubuff[j] >> 8) & 0xFF // ==> |-- ByteX --|-- Byte1 --|-- Byte2 --|-- Byte3 --|
                       // AND |-- 0x00  --|-- 0x00  --|-- 0x00  --|-- 0xFF  --|
                       // RES |-- 0x00  --|-- 0x00  --|-- 0x00  --|-- Byte3 --|
请注意所有位是如何向右移动8个位置的(正好是一个字节)。左侧的新字节是根据原始最高有效位(最左侧位)使用0或1填充的

现在我们来讨论
&
运算符。它对位执行按位AND操作。例如:

ubuff[j] >> 8 // ==> |-- ByteX --|-- Byte1 --|-- Byte2 --|-- Byte3 --|
(ubuff[j] >> 8) & 0xFF // ==> |-- ByteX --|-- Byte1 --|-- Byte2 --|-- Byte3 --|
                       // AND |-- 0x00  --|-- 0x00  --|-- 0x00  --|-- 0xFF  --|
                       // RES |-- 0x00  --|-- 0x00  --|-- 0x00  --|-- Byte3 --|
因此,我们实际上只剩下原始的
ubuff[j]
中的
Byte3

其他表达式也是如此:

int sR = (ubuff[j] >> 16) & 0xFF; // ==> Byte2
int sG = (ubuff[j] >>  8) & 0xFF; // ==> Byte3
int sB = (ubuff[j]      ) & 0xFF; // ==> Byte4

1->>表示右移位(此处用于从32位值中提取8个特定位)2——是的,它们甚至非常关键。如果你的C++参考指南不包括 > /Cl>,得到一个新的参考。这东西是很基础的,你不能直观地学习C++,你需要一个指南。至少你应该有其他的帮助来解释语言的更多的战略方面。C++是非常不宽容的。作为一种语言,除非你仔细阅读如何正确使用它,否则当你的程序崩溃或出现错误时,它会让你的生活变得非常痛苦。这些操作符绝对是语言的核心;如果你不“说话”,问代码的意义是没有用的首先,先掌握一门好的C++语言,然后再学习一段好的C++程序,谢谢你的建议。我在课程中没有机会去学习C++的部分。我会深入学习。谢谢你的解释。我没有机会学习C++的这一部分。现在我会更深入地学习它。然而,我不知道是否有一个C。简单地使用二维向量(vector@James_keni,可以使用标准容器!使用此方法是因为1)它非常紧凑2)它非常快3)一旦你习惯了它,它将看起来很自然4)你只需要一种方法来序列化和反序列化数据,所以你只需要写一次,并尽可能多地使用它。你的第二个假设是对的。似乎字节1没有被使用,因为我们只有R,G,B值;