Mat 函数

来源:互联网 发布:万户网络做网站怎么样 编辑:程序博客网 时间:2024/04/29 13:01

1、 Mat  frame = imread("apple.jpg");  读取图像

      if( !frame.date )

         return 0;

    Mat  image.create( frame.size( ),frame.type( ) );

    image.setTo( cv::Scalar(0,0,0) );

    Mat img_roi( Rect( 2,3,56,56 ) );

   //image.row(0).setTo(255,255,255);

2、imwrite("apple.jpg",frame);  保存图像为.jpg格式

 

3、imshow("image",frame); 显示图像

 

4、resize(frame,frame_temp,Size(width,height)); 改变图像大小

 

5、 cvtColor(frame, grayframe, CV_BGR2GRAY); 变图像为灰度图,还有其它的如下:

    CV_RGB2GRAY       CV_GRAY2BGR
    CV_GRAY2RGB       CV_BGR2YCrCb    CV_RGB2YCrCb    CV_YCrCb2BGR     CV_YCrCb2RGB  
                    CV_BGR2HSV      CV_RGB2HSV   

 

6、 创建一幅图像

      Mat frame = Mat(Size(width,height), CV_8UC3);   // CV_8UC1   CV_16UC3   CV_32SC1

 或  Mat frame;

       frame.create(Size(width,height), CV_8UC3); 

 

8、Mat frame; Mat frame_temp; //直接赋值矩阵

    frame_temp = frame; //只是创建了一个新的矩阵头,矩阵本身还是指向frame,frame变时,frame_temp也会变。

 

9、//深复制,完全复制

     Mat frame;   Mat frame_temp;

     frame_temp = frame.clone( );  

   或  frame.copyTo(frame_temp);

 

 浅复制:

Mat b;

Mat a = b;

Mat a = Mat( b,Rect(2,5,15,20) );

 

10、Mat frame;   //提取某个像素的值

       float value = frame.at(row,col);     

或   char value = frame.at(row,col); 

或   int value = frame.at(row,col); 

彩色图像:

      Vec3b value = frame.at(row,col); 

      Vec3i  value = frame.at(row,col); 

      Vec3s  value = frame.at(row,col); 

 

11、Mat frame; //更改某个像素的值

       frame.at(rows, cols) = 255; //注意如果char换成float或int都有可能会错,所以要先确定像素类型,若是8位的,只能用char,用int和float都会报错。

 

opencv c++ mat获取像素及像素赋值 

灰度图像获取像素值:

for (int i = 0; i < image.cols; i++) {    for (int j = 0; j < image.rows; j++) {                  uchar value = image.at(j,i);     }}


彩色图像获取像素分量值:

for (int i = 0; i < image.cols; i++) {    for (int j = 0; j < image.rows; j++) {        Vec3b intensity = image.at(j, i);        for(int k = 0; k < image.channels(); k++) {            uchar col = intensity.val[k];         }       }}
像素赋值 :
uchar pixValue;for (int i = 0; i < image.cols; i++) {    for (int j = 0; j < image.rows; j++) {        Vec3b &intensity = image.at(j, i);        for(int k = 0; k < image.channels(); k++) {            // calculate pixValue            intensity.val[k] = pixValue;        }     }}

12、absdiff( frame, frame_temp, silh_ );  //矩阵相减


13、threshold( silh_, silh_, 30, 255, CV_THRESH_BINARY );  //矩阵二值化

 

14、namedWindow("image");//创建图像窗口

 

15、  Mat frame;  IplImage* image;

       Mat 转换为IplImage*:       image = &(IplImage)frame;

       IplImage*  转换为Mat:      frame = image;

 

16、opencv读取视频:

       VideoCapture  cap(0);    //VideoCapture  cap("student.avi");

       if(!cap.isOpened())
       {return -1;}

       cap>>frame;         

       if(frame.empty())
       continue; 

 

17、imshow("Tracker", frame);// Display
        char key = (char)waitKey(1);

 

18、分出YUV三分量;

       Mat img_yuv;

       std::vector img_vec;

       split(img_yuv , img_vec);

       Mat Y_img = img_vec[0];

       Mat U_img = img_vec[1];

       Mat V_img = img_vec[2];

 

19、(图像掩码)把一幅图像的一块区域复制到另一幅图像的另一个区域

Mat image_1;

Rect rect_1 = Rect( 3,10,200,100 );

Mat image_2;

Rect rect_2 = Rect( 18,30,200,100 );

image_1(rect_1).copTo( image_2(rect_2) );

 

20、变换矩阵的行和列

        Mat Mat::reshap(int cn,int rows ) const

        参数cn:新的通道数;如果cn值为0表示变换前后通道数不变

        参数rows:新的行数;如果rows值为0表示变换后矩阵的行数不变

        例: Mat m = cv::Mat::zeros( 2, 2, CV_8UC1 );

                Mat m_t = reshap( 0, 4 );

原创粉丝点击