-
環(huán)境配置 :
OpenCV在xCode中的安裝與環(huán)境配置
-
函數(shù)介紹
Point
可定義2D點
Scalar
表示了具有4個元素的數(shù)組。在OpenCV中被大量用于傳遞像素值。line
繪制直線ellipse
繪制橢圓rectangle
繪制矩形circle
繪制圓fillPoly
繪制填充多邊形-
Point
- 使用Point描述一個點的方式
1. 第一種方式 :cv::Point point;
cv::point.x = x;
cv::point.y = y;
2. 第二種方式 :cv::Point point = cv::Point(x, y)
( x 和 y 分別表示具體的坐標值 )
注意 :
- 此處必須使用cv::Point
, 就算在引入頭文件下方加入了using namespace cv;
也不行,?接下來的代碼中也會出現(xiàn)必須加cv::
調(diào)用-
Scalar
這里用它來表示顏色值 第四個參數(shù)可省略:如下
Scalar(r, g, b);
RGB顏色值就為: Red = r; Green = g; Blue = b;
(OpenCV默認顏色值與RGB相反 ----> BGR,但是在OC上已經(jīng)被改為RGB)
-
繪圖實現(xiàn)代碼(Drawing)
-
我們來繪制一個竹蜻蜓
-
- 創(chuàng)建一個空的全黑像素的空圖像
Mat bamboo_dragonfly_image = Mat::zeros(w, w, CV_8SC3);
w
為全局變量闯袒,表示創(chuàng)建的空圖像像素。此處是double
類型;
double w = 500;
- 繪制一個圓(
circle
)
* 主要代碼
int circle_thickness = -1;
int circle_lineType = 8;
circle(img,
cv::Point(w / 2.0, w / 3.0),
w/32.0,
Scalar(0, 0, 255),
circle_thickness,
circle_lineType);
* 我們來看下 `circle ` 參數(shù)
circle(InputOutputArray img, // 我們創(chuàng)建的 Mat 空圖像(表示將圓加到圖像上面)
Point center, // 圓心所在坐標
int radius, // 圓的半徑
const Scalar& color, // 圓的顏色
int thickness = 1, // 線粗(-1將被填充)
int lineType = LINE_8, // 線形
int shift = 0 // 我也不知道干啥的桶蝎,可省略
)
- 繪制兩個橢圓 (
ellipse
)
* 左邊的橢圓代碼
int ellipse_thickness = -1;
int ellipse_lineType = 8;
ellipse(img,
cv::Point(w / 2.0 - w / 5.0, w / 3.0),
cv::Size(w / 5.0, w / 20.0),
0,
0,
360,
Scalar(255, 0, 0),
ellipse_thickness,
ellipse_lineType);
* 右邊的橢圓代碼
ellipse(img,
cv::Point(w / 2.0 + w / 5.0, w / 3.0),
cv::Size(w / 5.0, w / 20.0),
angle,
0,
360,
Scalar(255, 0, 0),
ellipse_thickness,
ellipse_lineType);
* 我們來看下 `ellipse ` 參數(shù)
ellipse(InputOutputArray img, // 我們創(chuàng)建的 Mat 空圖像(表示將圓加到圖像上面)
Point center, // 橢圓圓心所在坐標
Size axes, // 橢圓的 “長軸” 和 “短軸”
double angle, // 橢圓旋轉(zhuǎn)角度
double startAngle, // 橢圓擴展的弧度 開始
double endAngle, // 橢圓擴展的弧度 結(jié)束 (通過控制這里的兩個Angle,可以繪制弧線)
const Scalar& color, // 橢圓顏色
int thickness = 1, // 線粗(-1將被填充)
int lineType = LINE_8, // 線形
int shift = 0 // 上述橢圓中代碼省略了該參數(shù)
)
- 繪制一個矩形(
rectangle
)- 主要代碼
int rectangle_thickness = -1;
int rectangle_lineType = 8;
rectangle(atom_image,
cv::Point(w / 2.0 - w / 64, w / 3.0 + w / 34),
cv::Point(w / 2.0 + w / 64, w - 10),
Scalar(255, 255, 0),
rectangle_thickness,
rectangle_lineType);
* 我們來看下 `rectangle ` 參數(shù)
rectangle(InputOutputArray img, // 我們創(chuàng)建的 Mat 空圖像(表示將圓加到圖像上面)
Point pt1, // 起始點(我取的是矩形左上角的點)
Point pt2, // 終點(我取的是右下角的點)
這里兩個點(起始點谅畅,終點)取矩形對角的形勢登渣,確定對角,便確定了矩形的長寬毡泻。
const Scalar& color, // 顏色
int thickness = 1, // 線粗(-1將被填充)
int lineType = LINE_8, // 線形
int shift = 0) // 上述矩形代碼中省略了該參數(shù)
最后 我們需將 Mat 圖像轉(zhuǎn)換成 UIImage 對象
_imgView.image = MatToUIImage(bamboo_dragonfly_image);-
效果圖:
-
繪制直線代碼
cv::Point point_start = cv::Point(0, 15 * w / 16); cv::Point point_end = cv::Point(w, 15 * w / 16); int line_thickness = 2; int line_lineType = 8; line(img, // 同理這里首先得創(chuàng)建一個 Mat 空圖像 point_start, // 起始點 point_end, // 終點 Scalar(255, 255, 0), // 顏色 line_thickness, // 線粗 line_lineType); // 線形
-
繪制一個填充三角形代碼
- 創(chuàng)建 Mat 對象
Mat triangle_image = Mat::zeros(w, w, CV_8SC3);
- 繪制三角形的三個頂點
/** 創(chuàng)建三角形三個頂點 用矩陣的形式創(chuàng)建 /
cv::Point rook_points[1][3];
rook_points[0][0] = cv::Point(7 * w / 8.0, 7 * w / 8.0);
rook_points[0][1] = cv::Point(w - 7 * w / 8.0, 7 * w / 8.0);
rook_points[0][2] = cv::Point(w - 7 * w / 8.0, w - 7 * w / 8.0);
/* 創(chuàng)建三角形頂點集合 /
const cv::Point ppt[1] = {rook_points[0]};
/** 三角形頂點數(shù)目 */
int npt[] = {3};
fillPoly(triangle_image, // 將三角形放到圖像上
ppt, // 三角形頂點集合
npt, // 三角形頂點數(shù)量
1, // 繪制的數(shù)量
Scalar(255, 255, 255), // 三角形填充顏色
8); // 線形- 最后 我們需將 Mat 圖像轉(zhuǎn)換成 UIImage 對象
_imgView2.image = MatToUIImage(triangle_image);效果圖:
- 參考資料 :?OpenCV的基本繪圖