走进OpenCV,领略视觉之美.2

认识Mat


---------------------------------------------------------------------------------------------------------------------


从OpenCV2.0开始习惯用Mat容器来保存图片信息,个人觉得Mat容器比1.0版本的IplImage指针表示方法简单明了。


1.Mat内容用cout输出。


#include 
#include 

int
main(int argc, char *argv[])
{
  cv::Mat m1 = cv::Mat::eye(3,3,CV_32FC1);
  cv::Mat m2 = (cv::Mat_<cv::Vec2i>(2, 2) << cv::Vec2i(1,1), cv::Vec2i(2, 4), cv::Vec2i(3, 9), cv::Vec2i(4, 16));
  cv::Point_<int> p1(1,2);
  cv::Point3_<double> p2(1.5, 2.2, 3.9);
   
   // cv::Mat
   std::cout << "m1=" << m1 << std::endl << std::endl;
   // cv::Mat (multi-channel)
   std::cout << "m2=" << m2 << std::endl << std::endl;
   // cv::Point_, cv::Point3_
   std::cout << "p1=" << p1 << std::endl << std::endl;
   std::cout << "p2=" << p2 << std::endl << std::endl;
   // cv::MatExpr
   std::cout << "m1+m1+1=" << m1+m1+1 << std::endl;
}

输出结果:

走进OpenCV,领略视觉之美.2_第1张图片


2.Mat与IplImage的相互转换。


#include 
#include 
#include 

int main(int argc, char *argv[])
{
  // IplImage -> Mat(
  cv::Ptr<IplImage> ipl_img1 = cvLoadImage("../../image/lenna.png", CV_LOAD_IMAGE_COLOR);
  cv::Mat mat_img1a(ipl_img1);       // 数据共享
  CV_Assert(reinterpret_cast<uchar*>(ipl_img1->imageData) == mat_img1a.data);
  cv::Mat mat_img1b(ipl_img1, true); // 复制数据
  CV_Assert(reinterpret_cast<uchar*>(ipl_img1->imageData) != mat_img1b.data);

  // IplImage -> Mat(函数变换)
  cv::Mat mat_img1c = cv::cvarrToMat(ipl_img1);  // 复制数据
  CV_Assert(reinterpret_cast<uchar*>(ipl_img1->imageData) != mat_img1b.data);

  // Mat -> IplImage 
  cv::Mat mat_img2 = cv::imread("../../image/lenna.png", 1);
  IplImage ipl_img2 = mat_img2; // 数据共享
  CV_Assert(reinterpret_cast<uchar*>(ipl_img2.imageData) == mat_img2.data);
}

3.Mat与CvMat的相互转换

#include 
#include 

int main(int argc, char *argv[])
{
  double data[] = { 1, 2, 3, 4, 5, 6, 7, 8,  9, 10, 11, 12 };
  CvMat cv_mat1;
  cvInitMatHeader(&cv_mat1, 3, 4, CV_64FC1, data);

  // CvMat -> cv::Mat
  cv::Mat mat1(&cv_mat1); // 数据共享
  CV_Assert(cv_mat1.data.ptr == mat1.data);
  cv::Mat mat2(&cv_mat1, true); // 复制数据
  CV_Assert(cv_mat1.data.ptr != mat2.data);

  std::cout << "mat1=" << mat1 << std::endl << std::endl;

  // cv::Mat -> CvMat
  CvMat cv_mat2 = mat2; // 数据共享
  CV_Assert(cv_mat2.data.ptr == mat2.data);
}

你可能感兴趣的:(走进OpenCV,领略视觉之美.2)