scalar-颜色类
函数原型如下:
template<typename _Tp> class Scalar_ : public Vec<_Tp, 4>
{
public:
//! default constructor
Scalar_();
Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);//最常用;
Scalar_(_Tp v0);
Scalar_(const Scalar_& s);
Scalar_(Scalar_&& s) CV_NOEXCEPT;
Scalar_& operator=(const Scalar_& s);
Scalar_& operator=(Scalar_&& s) CV_NOEXCEPT;
template<typename _Tp2, int cn>
Scalar_(const Vec<_Tp2, cn>& v);
//! returns a scalar with all elements set to v0
static Scalar_<_Tp> all(_Tp v0);
//! conversion to another data type
template<typename T2> operator Scalar_<T2>() const;
//! per-element product
Scalar_<_Tp> mul(const Scalar_<_Tp>& a, double scale=1 ) const;
//! returns (v0, -v1, -v2, -v3)
Scalar_<_Tp> conj() const;
//! returns true iff v1 == v2 == v3 == 0
bool isReal() const;
};
Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);//最常用;
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Scalar color(2, 3, 4);
cout << "【颜色类】" << endl << color << endl;
color.all(0);
cout << color << endl;
return 0;
}
【颜色类】
[2, 3, 4, 0]
[2, 3, 4, 0]
请按任意键继续. . .
重点:
首先需要理解以下句子:
Mat M(7,7,CV_32FC2,Scalar(1,3));
解释如下:创建一个M矩阵,7行7列,类型为CV_32F,CV_32F表示每个元素的值的类型为32位浮点数,C2表示有2个通道。Scalar(1,3)是对矩阵进行初始化赋值。第一个通道全为1,第2个通道全为3。
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
void scalar_demo1() {
Mat M(4, 4, CV_32FC2, Scalar(1, 3));
cout << M << endl;
}
void scalar_demo2() {
Mat M(4, 4, CV_32FC3, Scalar(1, 2, 3));
cout << M << endl;
}
void scalar_demo3() {
Mat M(4, 4, CV_32FC4, Scalar(1, 2, 3));
cout << M << endl;
}
int main(void)
{
scalar_demo1();
cout << "**********************************" << endl;
scalar_demo2();
cout << "**********************************" << endl;
scalar_demo3();
Mat M(400, 400, CV_32FC3, Scalar(255, 0, 0));
/*cout << M << endl;*/
/*cout << M.rows << endl;
cout << M.cols << endl;*/
imshow("scalar_demo3", M);
waitKey(0);
return 0;
}
以下可以直观的了解到每一通道与Scala的关系:
M是以个像素容器,里面存放的是像素单元,通道数与BGR相对应;对于三通而言,scalar是设置bgr分量的值,相当于给每一个像素配色;
[1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0;
1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0;
1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0;
1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0]
成员函数all()
其作用是将图像中所用通道设置为指定数字;
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(void)
{
/*Mat scrImage(40, 40, CV_32FC3, Scalar(0, 255, 0));*/
Mat scrImage(40, 40, CV_32FC3);
Scalar color(0, 255, 0);
scrImage = color; //给每一像素赋值;
imshow("scalar_demo1", scrImage);
cout << scrImage << endl;
scrImage =color.all(0); /*将scrImage中每一个通道的值置成0;
要将color.all(0)赋值给scrImage,否则
color.all(0)没有意义;
所以使用时要指定对象(通过=);
*/
cout << scrImage << endl;
imshow("scalar_demo", scrImage);
waitKey(0);
return 0;
}
Mat scrImage(4, 4, CV_32FC3);//结果如下:
[0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0;
0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0;
0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0;
0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
请按任意键继续. . .
例子:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(void)
{
Mat M(10, 10, CV_32FC3, Scalar(255, 0, 0));
cout << M << endl;
/*cout << M.rows << endl;
cout << M.cols << endl;*/
imshow("scalar_demo3", M);
waitKey(0);
return 0;
}
[255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0;
255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0]
每一个【255, 0, 0】 代表一个蓝色像素点;
Mat M(10, 10, CV_32FC3, Scalar(255, 0, 0));
所以这句话可以理解为,创建一个10*10的像素矩阵,每一个像素RBG分量均是(255,0,0);
修改一下代码:
Mat M(400, 400, CV_32FC3, Scalar(255, 0, 0));
Mat M(400, 400, CV_32FC3, Scalar(255, 0, 0));
Mat M(400, 400, CV_8UC3, Scalar(0, 0, 255));
Mat M(400, 400, CV_8UC3, Scalar(127,255,212));