详解CvScalar类型

CvScalar类型 :

        它包括四个整型成员,当内存不是问题的时候,CvScalar经常用来代替1,2或者3个实数成员(这种情况下,不需要的分量被忽略掉),CvScalar有一个单独的成员val,val是一个指针,它指向一个4个双精度浮点数数组。

CvScalar就是一个可以用来存放4个double数值的数组,一般用来存放像素值(不一定是灰度值哦)最多可以存放四个通道。

typedef struct CvScalar
	{
		double val[4];
	}CvScalar;

       cvScalar是一个特殊的例子:它包含三个构造函数,分别是:

1—cvScalar()————它需要1至四个参数,并将这些参数传递给val[ ]中相应的元素;

CvScalar  c  vScalar( double val0, double val1 CV_DEFAULT(0),
                        double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
{
    CvScalar scalar;
    scalar.val[0] = val0; scalar.val[1] = val1;
    scalar.val[2] = val2; scalar.val[3] = val3;
    return scalar;
}

2—cvRealScalar()————该函数需要一个参数,传递个val[0],而val数组的其他元素被幅值为0;

CvScalar  cvRealScalar( double val0 )
	{
		CvScalar scalar;
		scalar.val[0] = val0;	//给第一个元素幅值
		scalar.val[1] = scalar.val[2] = scalar.val[3] = 0; //其他元素的值都等于0
		return scalar;
	}


3—cvScalarAll()————该函数需要一个参数,并且val[ ]数组中的其他元素都会被设置为这个值。

 CvScalar  cvScalarAll( double val0123 )  //只需要一个参数
	{
		CvScalar scalar;
		scalar.val[0] = val0123;			  //所有的元素都被赋值为这个元素
		scalar.val[1] = val0123;
		scalar.val[2] = val0123;
		scalar.val[3] = val0123;
		return scalar;
	}


4——最后——关于CvScalar的一个简单实例程序:
#include 
#include 
#include 
#include 

void CreateEchelonIdentity(CvArr *Array,CvScalar Color)   //画梯形图
{
    cvSetIdentity(Array,Color);
}
int main()
{
    IplImage *Image1; 

    CvSize Size1=cvSize(320,240);
    CvSize2D32f Size2 =cvSize2D32f(640.0,480.0);

    CvScalar Scalar1=cvScalar(0,1,2,3);
    CvScalar Scalar2=cvRealScalar(10);
    CvScalar Scalar3=cvScalarAll(20);
    CvScalar Scalar4=CV_RGB(255,255,3);

    Image1=cvCreateImage(Size1,IPL_DEPTH_8U,3); 
    CreateEchelonIdentity(Image1,Scalar4);

	cvNamedWindow("Echelon Identity",1);			//创建一个窗口
    cvShowImage("Echelon Identity",Image1);                     //显示图像

    printf("The Size1 height is : %d\n",Size1.height);
    printf("The Size1 width is : %d\n\n",Size1.width);

    printf("The Size2 height is : %.1f\n",Size2.height);
    printf("The Size2 width is : %.1f\n\n",Size2.width);

    printf("The Scalar1 is: (%.1f,%.1f,%.1f,%.1f)\n",Scalar1.val[0],Scalar1.val[1],Scalar1.val[2],Scalar1.val[3]);
    printf("The Scalar2 is: (%.1f,%.1f,%.1f,%.1f)\n",Scalar2.val[0],Scalar2.val[1],Scalar2.val[2],Scalar2.val[3]);
    printf("The Scalar3 is: (%.1f,%.1f,%.1f,%.1f)\n\n",Scalar3.val[0],Scalar3.val[1],Scalar3.val[2],Scalar3.val[3]);

    printf("The Scalar4 is: (%.1f,%.1f,%.1f,%.1f)\n",Scalar4.val[0],Scalar4.val[1],Scalar4.val[2],Scalar4.val[3]);

    cvWaitKey(0);
	return 0;

}




 显示结果如下:
详解CvScalar类型_第1张图片

综上:上面的例子体现出了CvScalar的不同构造函数的使用

cvScalar()为初始化数据结构,cvScalar可以输入四个参数为double型的数据,把它的值放在double类型的数组val中。

                cvRealScalar()则是只有一个参数值,cvRealScalar()函数只会让val[0]有初始值,其他四个元素的值相同且都等于0;

cvScalarAll()函数是只有一个参数值,但是它的四个元素都是该参数值。

你可能感兴趣的:(OpenCV笔记)