Opencv 使用 cv::Mat 创建新图像
Opencv create new image using cv::Mat
我是 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.Why 发生这种情况是因为,两者都创建了一个 Mat 图像结构。
2.what 是 const cv:Scalar &_s.
的目的
我从 Opencv 站点 (opencv.pdf,opencv2refman.pdf) 和 Oreilly 的 Opencv 书籍中搜索了文档。但是找不到解释的答案。
我想我正在使用 Mat(int _rows,int _cols,int _type,const cv:Scalar &_s) 结构。
首先,您需要以下信息来创建图像:
- 宽度:301 像素
- 高度:260 像素
- 每个像素值(强度)为0~255:一个8位无符号整数
- 支持所有 RGB 颜色:3 通道
- 初始颜色:黑色 = (B, G, R) = (0, 0, 0)
您可以使用 cv::Mat
创建图像:
Mat grHistogram(260, 301, CV_8UC3, Scalar(0, 0, 0));
8U
表示8位U有符号整数,C3
表示3 C通道为RGB颜色,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)
。
回到你的问题,
Why this happening since, both create a Mat image structure?
因为你需要指定Mat
的类型。它是彩色图像 CV_8UC3
还是灰度图像 CV_8UC1
?它们是不同的。如果您在 CV_8UC3
图像上使用 Scalar(255)
,您的程序可能无法像您想象的那样工作。
What is the purpose of const cv:Scalar &_s ?
cv::Scalar
用于指定每个像素的强度值。例如,如果类型为 CV_8UC3
,Scalar(255, 0, 0)
为蓝色,Scalar(0, 0, 0)
为黑色。如果是 CV_8UC1
灰度图像,则 Scalar(0)
为黑色。避免将它们混合在一起。
您可以创建单通道图像或多通道图像。
创建单通道图像: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
我是 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.Why 发生这种情况是因为,两者都创建了一个 Mat 图像结构。 2.what 是 const cv:Scalar &_s.
的目的我从 Opencv 站点 (opencv.pdf,opencv2refman.pdf) 和 Oreilly 的 Opencv 书籍中搜索了文档。但是找不到解释的答案。
我想我正在使用 Mat(int _rows,int _cols,int _type,const cv:Scalar &_s) 结构。
首先,您需要以下信息来创建图像:
- 宽度:301 像素
- 高度:260 像素
- 每个像素值(强度)为0~255:一个8位无符号整数
- 支持所有 RGB 颜色:3 通道
- 初始颜色:黑色 = (B, G, R) = (0, 0, 0)
您可以使用 cv::Mat
创建图像:
Mat grHistogram(260, 301, CV_8UC3, Scalar(0, 0, 0));
8U
表示8位U有符号整数,C3
表示3 C通道为RGB颜色,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)
。
回到你的问题,
Why this happening since, both create a Mat image structure?
因为你需要指定Mat
的类型。它是彩色图像 CV_8UC3
还是灰度图像 CV_8UC1
?它们是不同的。如果您在 CV_8UC3
图像上使用 Scalar(255)
,您的程序可能无法像您想象的那样工作。
What is the purpose of const cv:Scalar &_s ?
cv::Scalar
用于指定每个像素的强度值。例如,如果类型为 CV_8UC3
,Scalar(255, 0, 0)
为蓝色,Scalar(0, 0, 0)
为黑色。如果是 CV_8UC1
灰度图像,则 Scalar(0)
为黑色。避免将它们混合在一起。
您可以创建单通道图像或多通道图像。
创建单通道图像: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