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

Lus*_*sy7 13 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);
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,如果我在第二个代码中使用标量(0)而不是标量(0,0,0),代码不起作用.为什么会发生这种情况,两者都会创建一个Mat图像结构.2. const cv的目的是什么:Scalar&_s.

我从Opencv网站(opencv.pdf,opencv2refman.pdf)和Oreilly的Opencv书中搜索Documentaion.但找不到解释的答案.

我想我正在使用Mat(int _rows,int _cols,int _type,const cv:Scalar&_s)struct.

mcc*_*chu 21

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

  1. 宽度:301像素
  2. 高度:260像素
  3. 每个像素值(强度)为0~255:8位无符号整数
  4. 支持所有RGB颜色:3个通道
  5. 初始颜色:黑色=(B,G,R)=(0,0,0)

您可以使用cv::Mat以下方法创建图像:

Mat grHistogram(260, 301, CV_8UC3, Scalar(0, 0, 0));
Run Code Online (Sandbox Code Playgroud)

8U意味着8U有符号整数,C3意味着RGB颜色为3 C hannels,并且Scalar(0, 0, 0)是每个像素的初始值.同样的,

line(grHistrogram,pt1,pt2,Scalar(255,255,255),1,8,0);
Run Code Online (Sandbox Code Playgroud)

是画一条线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&_s?

cv::Scalar用于指定每个像素的强度值.例如,如果是类型,Scalar(255, 0, 0)则为蓝色并Scalar(0, 0, 0)为黑色CV_8UC3.或者Scalar(0)是黑色的,如果它是一个CV_8UC1灰度图像.避免将它们混合在一起


小智 8

您可以创建单通道图像或多通道图像.

创建单个频道图像: 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