使用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存成文字檔
直接將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提供的額外工具
留言