使用OpenCV常見的問題

OpenCV官方有很多說明
http://docs.opencv.org/doc/user_guide/ug_mat.html#basic-operations-with-images

Mat設定初始值

Mat img(H, W, CV_8UC3, Scalar(255,0,255)); //建立的時候給初始值

img = 0; // 單Channel的圖片可以用這個初始化成0, 多Channel的請用第四種

img = Scalar(0); 

img = Scalar(255,0,255); // 粉紅色(參數順序是B,G,R)

img = CV_RGB(255,0,255); // 參數順序是R,G,B


灰階圖轉成彩色圖

拷貝Mat內容

Mat img1 = img.clone();

或是

Mat img1;
img.copyTo(img1);


將Mat轉成IplImage

// 記得include cv.h, opencv.hpp
// 且要記得using namespace cv;

// 因為Mat轉過來的cv1_img是結構變數, 不是指標變數指到這個結構, 
// 所以在丟進去opencv的函數時,要加上&讓結構變數變成指標可以指到的位置
IplImage cv1_img = image;
cvShowImage("CV1", &cv1_img); 
                              
cvWaitKey(0);


// 覺得有這種每次都要加上&的用法很麻煩, 就再宣告一個指標變數, 指在前面的這個結構變數上
// 之後就只用這個指標變數來作處理。
IplImage* ptr_cv1_img = &cv1_img;
cvShowImage("CV1 ptr", ptr_cv1_img);
cvWaitKey(0);



反過來將IplImage轉成Mat

// 記得include cv.h, opencv.hpp
// 且要記得using namespace cv;

IplImage* image = cvLoadImage(argv[1], 1);
Mat cv2_img(image);
imshow("CV2", cv2_img);
waitKey();



彩色圖分成RGB三個Mat

  Mat Intensity[3]; // 三個空的Mat(不是空的也可以)
  
  split(image, Intensity); // 將image分解成三個Mat

  for (int c=0 ; c<3 ; ++c)
  {
    imshow("show each channel", Intensity[c]);
    waitKey();
  }

將Mat存成文字檔

cout << format(image, "csv" ); // CSV檔是逗號分隔檔,請見wiki

直接將Mat印出來

cout << image << endl;


判斷是哪種型態的Mat

if (image.type() == CV_32FC2)
  cout << "雙Channel的float型態Mat"  << endl;
else if (image.type() == CV_64F)
  cout << "double型態Mat"  << endl;
else if (image.type() == CV_8UC3)
  cout << "三Channel的unsigned char型態Mat,一般的彩圖是這種型態!"  << endl;
else if (image.type() == CV_8U)
  cout << "unsigned char型態Mat,一般的灰階圖是這種型態!" <endl;
else
  cout <<"其實還有很多種,但是無法一一列舉,請自行從上面的規則判斷<< endl;

測時間

  double t = (double)getTickCount();

  // ~~ 做處理 ~~

  t = ((double)getTickCount() - t)/getTickFrequency();

OpenCV提供的額外工具


留言