码迷,mamicode.com
首页 > 其他好文 > 详细

MAT 函数

时间:2017-09-27 19:14:55      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:clu   ora   窗口   一个   dos   cto   array   imshow   imwrite   

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 );

 

Opencv显示创建Mat对象的七种方式

 方式一

#include<iostream>  
#include<opencv2/opencv.hpp>  
  
using namespace std;  
using namespace cv;  
  
int main()  
{  
    //创建一个2*2 类型为8位的uchar类型三通道的 颜色为黄色  
    Mat img(2, 2, CV_8UC3, Scalar(0, 255, 255));  
    cout << "矩阵元素" << endl << img << endl;  
  
    /*Mat srcImage = imread("G:\\group.jpg"); 
    cout << "图片矩阵" << endl << srcImage << endl;*/  
  
    return 0;  
}  

  技术分享

方式二:

创建三维的矩阵

//创建一个超过二维的矩阵  
#include<iostream>  
#include<opencv2/opencv.hpp>  
  
using namespace std;  
using namespace cv;  
  
int main()  
{  
    int sz[3] = { 2, 2, 2 };  
    //3维的  为2*2*2的   元素全部为0  
    Mat array2(3, sz, CV_8UC1, Scalar(0));  
  
    //因为是三维的,所以不能用DOS界面显示  
  
    return 0;  
}  

  方式三:

 

为已经存在的IplImage指针创建一个信息头

//为已经存在的IplImage指针创建一个信息头  
#include<opencv2/opencv.hpp>  
  
using namespace cv;  
  
int main()  
{  
    IplImage *img = cvLoadImage("G:\\group.jpg", 1);  
  
    Mat srcImage(img);  
  
    imshow("【测试代码】", srcImage);  
  
    waitKey(0);  
  
    return 0;  
}  

  技术分享

方式四:

用Create函数实现对Mat的初始化

//用Create函数实现对Mat的初始化  
#include<opencv2/opencv.hpp>  
#include<iostream>  
  
using namespace cv;  
using namespace std;  
  
int main()  
{  
    Mat img;  
    img.create(4, 4, CV_8UC(2));  
  
    cout << "M = " << endl << img << endl;  
  
    return 0;  
}  

  技术分享

方式七:

为已存在的对象创建新信息头

//为已存在的对象创建新信息头  
#include<iostream>  
#include<opencv2/opencv.hpp>  
  
using namespace std;  
using namespace cv;  
  
int main()  
{  
    Mat srcImage(3, 3, CV_8UC3, Scalar(0, 0, 255));  
  
    Mat copyImage;  
    srcImage.copyTo(copyImage);  
  
    Mat newImage = srcImage.row(1).clone();  
    cout << "运行结果" << endl << newImage << endl;  
  
    return 0;  
}  

  技术分享

 

MAT 函数

标签:clu   ora   窗口   一个   dos   cto   array   imshow   imwrite   

原文地址:http://www.cnblogs.com/dongvdong/p/7602928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!