c++ OpenCV使用cv::Mat创建新映像

vhmi4jdf  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(116)

我是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图像结构。

  1. const cv:Scalar &_s的目的是什么。
    我搜索了OpenCV网站(opencv.pdf,opencv2refman.pdf)和Oreilly的OpenCV书籍中的文档,但没有找到一个解释性的答案。
    我想我使用的是Mat(int _rows, int _cols, int _type, const cv:Scalar &_s)结构。
nhhxz33t

nhhxz33t1#

首先,您需要以下信息来创建映像:
1.宽度:301像素
1.高度:260像素
1.每个像素值(强度)为0 ~ 255:8位无符号整数
1.支持所有RGB颜色:3通道
1.初始颜色:黑色=(B,G,R)=(0,0,0)
您可以使用cv::Mat创建图像:

Mat grHistogram(260, 301, CV_8UC3, Scalar(0, 0, 0));

字符串
8U表示8U有符号整数,C3表示RGB颜色的3个C通道,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?它们是不同的。如果你在CV_8UC3图像上使用Scalar(255),你的程序可能不会像你想象的那样工作。
const cv:Scalar &_s的作用是什么?
cv::Scalar用于指定每个像素的强度值。例如,如果类型为CV_8UC3,则Scalar(255, 0, 0)为蓝色,Scalar(0, 0, 0)为黑色。或者,如果是CV_8UC1灰度图像,则Scalar(0)为黑色。请避免将它们混合在一起。

6ju8rftf

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

相关问题