我是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);
型
现在我的问题是如果我在第二个代码中使用了scalar(0)
而不是scalar(0,0,0)
,代码就不工作了,我的问题是
1.为什么会发生这种情况,因为两者都创建了Mat图像结构。
- const
cv:Scalar &_s
的目的是什么。
我搜索了OpenCV网站(opencv.pdf,opencv2refman.pdf)和Oreilly的OpenCV书籍中的文档,但没有找到一个解释性的答案。
我想我使用的是Mat(int _rows, int _cols, int _type, const cv:Scalar &_s)
结构。
2条答案
按热度按时间nhhxz33t1#
首先,您需要以下信息来创建映像:
1.宽度:301像素
1.高度:260像素
1.每个像素值(强度)为0 ~ 255:8位无符号整数
1.支持所有RGB颜色:3通道
1.初始颜色:黑色=(B,G,R)=(0,0,0)
您可以使用
cv::Mat
创建图像:字符串
8U
表示8位U有符号整数,C3
表示RGB颜色的3个C通道,Scalar(0, 0, 0)
是每个像素的初始值。类似地,型
是在
grHistogram
上画一条从点pt1
到点pt2
的线。线的颜色是白色(255,255,255),具有1像素厚度,8连接线和0偏移。有时你不需要RGB颜色的图像,而需要一个简单的灰度图像。也就是说,使用一个通道而不是三个。类型可以更改为
CV_8UC1
,并且你只需要指定一个通道的强度,例如Scalar(0)
。回到你的问题,
为什么会发生这种情况,因为两者都创建了一个Mat图像结构?
因为你需要指定
Mat
的类型。是彩色图像CV_8UC3
还是灰度图像CV_8UC1
?它们是不同的。如果你在CV_8UC3
图像上使用Scalar(255)
,你的程序可能不会像你想象的那样工作。const cv:Scalar &_s的作用是什么?
cv::Scalar
用于指定每个像素的强度值。例如,如果类型为CV_8UC3
,则Scalar(255, 0, 0)
为蓝色,Scalar(0, 0, 0)
为黑色。或者,如果是CV_8UC1
灰度图像,则Scalar(0)
为黑色。请避免将它们混合在一起。6ju8rftf2#
您可以创建单通道图像或多通道图像。
创建单通道映像:
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