OPENCV-3 學習筆記
imread()讀入圖,第一個參數,const string&類型的filename,填我們需要載入的圖片路徑名,?第二個參數,int類型的flags,為載入標識,它指定一個加載圖像的顏色類型。
namedWindow()用于創建一個窗口,const string&型的name,即填被用作窗口的標識符的窗口名稱,int 類型的flags?,窗口的標識。
imshow()顯示一幅圖像,第一個參數,const string&類型的winname,填需要顯示的窗口標識名稱,第二個參數,InputArray?類型的mat,填需要顯示的圖像。
imwrite()輸出圖像到文件,第一個參數,const string&類型的filename,填需要寫入的文件名就行了,帶上后綴,比如,“hehe.jpg”。第二個參數,InputArray類型的img,一般填一個Mat類型的圖像數據就行了。第三個參數,const vector&類型的params,表示為特定格式保存的參數編碼,它有默認值vector(),所以一般情況下不需要填寫。
基本數據結構
1、Mat類—基礎圖像容器
由兩個數據部分組成:矩陣頭(包含矩陣尺寸、存儲方法、存儲地址等信息)和一個指向存儲所有像素值的矩陣的指針。
Mat A,C; //創建信息頭部分
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR); //為矩陣開辟內存
Mat B(A); //使用拷貝構造函數
C=A;
//ROI
Mat D = (A,Rect(10,10,100,100)); //使用矩形界定
Mat D = A(Range:all(),Range(1,3)); //使用行和列界定
結構:
- M.data? 數據區域的指針
- M.dims? 矩陣維度
- M.sizes? 維度
- M.elemSize()? 每個元素占的字節空間大小,與元素類型相關,如CV_8U
- M.step[]? 用來計算元素地址, M.step[i] 表示所有比i大的維度所占空間大小
2、Vec—模板類,主要用于存儲數值向量
//示例
//可用來定義任意類型的向量,uchar、short、int、float、double
Vec<double, 5> Vector; // 定義一個存放5個double型變量的向量 //使用[]訪問Vec向量成員
Vector[0]=10010;//支持運算類型
v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2
v1 == v2, v1 != v2
norm(v1) (euclidean norm)
3、Scalar類—從Vec類引出的模板類,是一個可存放4個元素的向量,主要用于傳遞和讀取圖像中的像素值
//定義BGR三個通道的顏色(藍色、綠色、紅色)
cv::Scalar myScalar;
myScalar = cv::Scalar(255,255,255); //讀取彩色圖像像素值(三通道)
cv::Mat pImg = cv::imread("1.jpg", 1); //1表示以彩色圖像讀入
if (!pImg.data)return 0;
int x = 100, y = 100; //定義點
cv::Scalar pixel = pImg.at<Vec3b>(x, y);//選取位置
cout << "B chanel of pixel is = " << pixel.val[0] << endl;
cout << "G chanel of pixel is = " << pixel.val[1] << endl;
cout << "R chanel of pixel is = " << pixel.val[2] << endl;
4、Point類—用于表示2維坐標(x,y)
//定義圖像中的點
cv::Point pt = Point(10, 10);
//二維空間中的點
cv::Point2d、cv::Point2d32f(指定為浮點型)
//三維空間中的點
cv::Point3d
//運算類型
pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 += pt2;
pt1 -= pt2;
pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2;
pt1 != pt2;
5、Size類—可表示一幅圖像或一個矩形的大小。它包含寬、高2個成員:width , height還有一個面積函數area()
//定義
cv::Size size(int w, int h);
6、Rect類—用于定義2維矩形的模板類,可以用來定義圖像的ROI區域。
//定義
cv::Rect rect(x, y, width, height);
//選取ROI區域
cv::Mat pImg = imread("1.jpg",1);
cv::Rect rect(80,20,100,100);//(x,y)=(80,20),w=100,height=100
cv::Mat roi = cv::Mat(pImg, rect);
cv::Mat pImgRect = pImg.clone();
cv::rectangle(pImgRect,rect,cv::Scalar(0,255,0),2);
cv::imshow("original image with rectangle",pImgRect);
cv::imshow("roi",roi);
cv::waitKey();
7、RotatedRect類—特殊的矩形。這個類通過中心點,寬度和高度和旋轉角度來表示一個旋轉的矩形。
/*定義
center:中心點坐標Point2f類型
size:矩形的寬度和高度,Size2f類型
angle:順時針方向的旋轉角度(單位°),float類型
*/
RotatedRect(const Point2f& center, const Size2f& size, float angle); //RotatedRect cv::Point2f center(100, 100);cv::Size2f size(100, 50);float angle = 45;// try 10, 30, 45 RotatedRect rRect(center, size, angle);cv::Mat image(200, 200, CV_8UC3, cv::Scalar(0));Point2f vertices[4];rRect.points(vertices);for (int i = 0; i < 4; i++)line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0));Rect brect = rRect.boundingRect();rectangle(image, brect, Scalar(255, 0, 0));imshow("rectangles", image);waitKey(0);
8、Rang類—表示范圍
Mat m(300,300,CV32F);
Mat part = m(Range::all(), Range(20, 200));