Opencv使用cv :: Mat创建新图像

时间:2015-02-28 11:01:49

标签: c++ opencv image-processing

我是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。

2 个答案:

答案 0 :(得分:20)

首先,您需要以下信息来创建图像:

  1. 宽度:301像素
  2. 高度:260像素
  3. 每个像素值(强度)为0~255:8位无符号整数
  4. 支持所有RGB颜色:3个频道
  5. 初始颜色:黑色=(B,G,R)=(0,0,0)
  6. 您可以使用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);
    

    是从grHistogrampt1到点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

相关问题