OpenCV2.4.3 CheatSheet學習(四)

五、數據的輸入和輸出

1.
將數據寫入YAML(或XML

注意,在OpenCV中,無論讀寫,文件的格式均由指定的後綴名確定。示例:

FileStorage fs("test.yml", FileStorage::WRITE);
fs << "i"<< 5 <<"r" << 3.1<< "str"<< "ABCDEFGH";
fs << "mtx"<< Mat::eye(3,3,CV_32F);
fs << "mylist"<< "["<< CV_PI<< "1+1"<< "{:"<< "month"<< 12<< "day"<< 31<< "year"<< 1969<< "}"<< "]";
fs << "mystruct"<< "{"<< "x"<< 1 <<"y" << 2<< "width"<< 100<< "height"<< 200<< "lbp"<< "[:";
const uchar arr[] = {0, 1, 1, 0, 1, 1, 0, 1};
fs.writeRaw("u", arr, (int)(sizeof(arr)/sizeof(arr[0])));
fs << "]"<< "}";

讀寫方法基本和C++沒什麼兩樣,很簡單哈。
用記事本或IE就可以打開test.yml文件,可以很清楚的看到文件中的數據結構:

%YAML:1.0
i: 5
r: 3.1000000000000001e+000
str: ABCDEFGH
mtx: !!opencv-matrix
   rows: 3
   cols: 3
   dt: f
   data: [ 1.,0., 0., 0., 1., 0., 0., 0., 1. ]
mylist:
   -3.1415926535897931e+000
   - "1+1"
   - { month:12,day:31, year:1969 }
mystruct:
   x: 1
   y: 2
   width:100
   height:200
   lbp: [ 0, 1,1, 0, 1, 1, 0, 1 ]

2.
將數據讀回

FileStorage fs("test.yml", FileStorage::READ);
int i1 = (int)fs["i"];
double r1 = (double)fs["r"];
string str1 = (string)fs["str"];
Mat M;
fs["mtx"] >> M;
FileNode tl = fs["mylist"];
CV_Assert(tl.type() == FileNode::SEQ&& tl.size() == 3);
double tl0 = (double)tl[0];
string tl1 = (string)tl[1];
int m = (int)tl[2]["month"], d = (int)tl[2]["day"];
int year = (int)tl[2]["year"];
FileNode tm = fs["mystruct"];
Rect r;
r.x = (int)tm["x"], r.y = (int)tm["y"];
r.width = (int)tm["width"], r.height = (int)tm["height"];
int lbp_val = 0;
FileNodeIterator it = tm["lbp"].begin();
for(int k = 0; k < 8; k++, ++it)
  lbp_val |= ((int)*it)<< k;

這段代碼把上面寫入文件的數據再讀回來。

3.
讀寫圖像,最常用的操作

imwrite("myimage.jpg", image);
Mat imagecolorcopy = imread("myimage.jpg", 1);
Mat imagegrayscalecopy = imread("myimage.jpg", 0);

MATLAB中的同名函數用法基本一樣,很方便。文件格式由指定的後綴名確定。
imread
可以指定讀取圖像的格式,參數0就是CV_LOAD_IMAGE_GRAYSCALE,即讀取爲灰度圖;參數1就是CV_LOAD_IMAGE_COLOR,即讀取爲彩色圖。
可以支持如下文件格式:
BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM/ PGM / PPM (.pbm, .pgm, .ppm), Sun Raster (.sr), JPEG 2000(.jp2).
每種格式都支持8比特的單通道或3通道圖像,PNGJPEG2000格式支持16bit

4.
從文件或相機中讀取視頻

VideoCapture cap;
if(argc>1)
  cap.open(string(argv[1]));
else
  cap.open(0);
Mat frame;
namedWindow("video", 1);
for(;;)
{
  cap>> frame;
  if(!frame.data)
    break;
  imshow("video", frame);
  if(waitKey(30)>= 0)
    break;
}

如果指定了相機名稱則打開對應的相機,否則打開默認相機0。打開一個名叫video的窗口,以30ms爲間隔顯示視頻,也就是約33.33fps


六、GUI(Graphical User Interface)組件

namedWindow(winname,flags)
創建一個窗口,用於顯示。

destroyWindow(winname)
銷燬一個窗口。

destroyAllWindows()
銷燬所有窗口。

imshow(winname, mtx)
在指定的窗口中顯示圖像。

waitKey(delay)
等待delay毫秒,如果delay0則一直等待。返回值是按鍵值,常用於顯示圖像的刷新和對按鍵的處理。

createTrackbar(...)
創建一個滑動條。

setMouseCallback(...)
設置鼠標事件的回調函數。

可以從camshiftdemo.cpp以及其他OpenCV示例工程中學習GUI的詳細使用方法。


七、相機校準、姿態估計、深度估計

相機校準主要用到了張正友的棋盤格校準法,在OpenCV文件夾裏可以找到棋盤格圖像pattern.png,打印下來貼到一個硬板上就可以用以下函數對相機參數進行校準了。

calibrateCamera()
利用對棋盤格的一系列抓拍圖像對相機進行校準。

findChessboardCorners()
尋找棋盤格的角點。

剩下的我都沒用過:
solvePnP()
stereoCalibrate()
stereoRectify()
initUndistortRectifyMap()
StereoBM, StereoSGBM
reprojectImageTo3D()
findHomography()


八、目標識別
matchTemplate
CascadeClassifier
HOGDescriptor


sume
2013/1/5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章