我是opencv的新手,我正在尝试一些示例代码。
在一个代码Mat gr(row1,col1,CV_8UC1,scalar(0));
int x = gr.at<uchar> (row,col);
另一个,
Mat grHistrogram(301,260,CV_8UC1,Scalar(0,0,0));
line(grHistrogram,pt1,pt2,Scalar(255,255,255),1,8,0);
现在我的问题是,如果我在第二个代码中使用标量(0)而不是标量(0,0,0),代码不起作用。 为什么会发生这种情况,两者都会创建一个Mat图像结构。 2. const cv的目的是什么:Scalar&amp; _s。
我从Opencv网站(opencv.pdf,opencv2refman.pdf)和Oreilly的Opencv书中搜索Documentaion。但找不到解释的答案。
我认为我正在使用Mat(int _rows,int _cols,int _type,const cv:Scalar&amp; _s)struct。
答案 0 :(得分:20)
首先,您需要以下信息来创建图像:
您可以使用cv::Mat
:
Mat grHistogram(260, 301, CV_8UC3, Scalar(0, 0, 0));
8U
表示 8 位 U 有符号整数,C3
表示RGB 3 C hannels颜色,Scalar(0, 0, 0)
是每个像素的初始值。同样,
line(grHistrogram,pt1,pt2,Scalar(255,255,255),1,8,0);
是从grHistogram
点pt1
到点pt2
画一条线。线的颜色为白色(255,255,255),厚度为1像素,8连线,0档。
有时您不需要RGB彩色图像,而是需要简单的灰度图像。也就是说,使用一个通道而不是三个通道。类型可以更改为CV_8UC1
,您只需要指定一个频道的强度,例如Scalar(0)
。
回到你的问题,
为什么会发生这种情况,都会创建Mat图像结构?
因为您需要指定Mat
的类型。是彩色图像CV_8UC3
还是灰度图像CV_8UC1
?它们是不同的。如果您在Scalar(255)
图片上使用CV_8UC3
,您的计划可能无法正常运作。
const cv的目的是什么:Scalar&amp; _s?
cv::Scalar
用于指定每个像素的强度值。例如,如果类型为Scalar(255, 0, 0)
,则Scalar(0, 0, 0)
为蓝色,CV_8UC3
为黑色。或Scalar(0)
如果是CV_8UC1
灰度图像,则为黑色。避免将它们混合在一起。
答案 1 :(得分:6)
您可以创建单通道图像或多通道图像。
创建单个频道图片:Mat img(500, 1000, CV_8UC1, Scalar(70));
创建多渠道形象:Mat img1(500, 1000, CV_8UC3, Scalar(10, 100, 150));
您可以从以下页面中查看更多示例和详细信息。 https://progtpoint.blogspot.com/2017/01/tutorial-3-create-image.html