2020年9月27日 星期日

OpenCV Drawing Functions

 這次來介紹OpenCV常用的六個畫圖函式,分別有畫線(line)、畫圓(circle)、畫矩形(rectangle)、畫橢圓(ellipse)、畫多邊形(polylines)、文字顯示(putText)等,說明如下:

--------------------------------------------------------------------------------------------------------------

1.line (InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)

img:輸入影像

pt1:起點座標

pt1:終點座標

color:顏色

thickness:預設厚度為1

lineType:預設8連結,選項有LINE_4 (4連結)、LINE_8(8連結) 、LINE_AA (反鋸齒)

shift:預設座標小數點數為0

--------------------------------------------------------------------------------------------------------------

2.circle (InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)

img:輸入影像

center:圓心座標

radius:半徑

color:顏色

thickness:預設厚度為1

lineType:預設8連結,選項有LINE_4 (4連結)、LINE_8(8連結) 、LINE_AA (反鋸齒)

shift:預設座標小數點數為0

--------------------------------------------------------------------------------------------------------------

3.rectangle (Mat &img, Rect rec, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
rectangle (InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)

img:輸入影像

rect:矩形範圍(矩形左上角x座標,矩形左上角y座標,矩形寬度,矩形高度)

pt1:矩形左上角座標

pt2:矩形右下角座標

color:顏色

thickness:預設厚度為1

lineType:預設8連結,選項有LINE_4 (4連結)、LINE_8(8連結) 、LINE_AA (反鋸齒)

shift:預設座標小數點數為0

除此之外,如果想要繪製旋轉的矩形,則是定義RotateRect,並搭配line一條一條繪製,可參考下列程式碼

--------------------------------------------------------------------------------------------------------------

4.ellipse (InputOutputArray img, const RotatedRect &box, const Scalar &color, int thickness=1, int lineType=LINE_8)
ellipse (InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)

img:輸入影像

rotatedRect:旋轉矩形範圍(Point2f圓心座標, Size2f 矩形寬高,旋轉角度)

center:圓心座標

axes:橢圓長短軸長度的一半

angle:橢圓旋轉角度(請參考下圖,3.2.0版本圖片似乎是錯誤的,所以選3.3.0的圖片說明,註1)

startAngle:繪製起始角度(請參考下圖,註1)

endAngle:繪製結束角度(請參考下圖,註1)

color:顏色

thickness:預設厚度為1

lineType:預設8連結,選項有LINE_4 (4連結)、LINE_8(8連結) 、LINE_AA (反鋸齒)

shift:預設座標小數點數為0



--------------------------------------------------------------------------------------------------------------

5.polylines (InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)

img:輸入影像

pts:點座標

isClosed:是否為封閉輪廓

color:顏色

thickness:預設厚度為1

lineType:預設8連結,選項有LINE_4 (4連結)、LINE_8(8連結) 、LINE_AA (反鋸齒)

shift:預設座標小數點數為0

--------------------------------------------------------------------------------------------------------------

6.putText (InputOutputArray img, const String &text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=LINE_8, bool bottomLeftOrigin=false)

img:輸入影像

text:欲輸入文字內容

org:文字左下角座標

fontFace:文字類型(請參考下圖,註2)

fontScale:文字大小

color:顏色

thickness:預設厚度為1

lineType:預設8連結,選項有LINE_4 (4連結)、LINE_8(8連結) 、LINE_AA (反鋸齒)

shift:預設座標小數點數為0


--------------------------------------------------------------------------------------------------------------

程式碼如下:

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(){

	Mat SrcImg(500, 500, CV_8UC3, Scalar(0, 0, 0));
	Point StartPt = Point(25, 25), EndPt = Point(475, 475);
	Point TextPt = Point(250, 65), CenterPt = Point(250, 250);
	Size2f RotateSize = Size2f(200, 60);
	int Thickness = 3;

	//line function
	line(SrcImg, StartPt, EndPt, Scalar(0, 255, 0), Thickness, 8, 0);

	//circle function
	circle(SrcImg, CenterPt, 30, Scalar(0, 255, 255), -1, 8, 0);

	//rectangle function
	Rect NormalRect = Rect(25, 25, 100, 100);
	rectangle(SrcImg, NormalRect, Scalar(255, 0, 0), Thickness, 8, 0);
	rectangle(SrcImg, Point(375, 375), EndPt, Scalar(255, 0, 0), Thickness, 8, 0);

	//rotatedRect function
	RotatedRect RotateRect = RotatedRect(CenterPt, RotateSize, 45);
	Point2f Vertices[4];
	RotateRect.points(Vertices);
	for (int i = 0; i < 4; i++)
		line(SrcImg, Vertices[i], Vertices[(i + 1) % 4], Scalar(255, 255, 0), Thickness, 8, 0);

	//ellipse function
	ellipse(SrcImg, CenterPt, Size(RotateSize.width / 2, RotateSize.height / 2), -45, 0, 360, Scalar(255, 0, 255), Thickness, 8, 0);
	ellipse(SrcImg, RotateRect, Scalar(255, 0, 255), Thickness, 8);

	//polylines function
	vector polygons;
	polygons.push_back(Point(25, 125));
	polygons.push_back(Point(125, 125));
	polygons.push_back(Point(125, 375));
	polygons.push_back(Point(375, 375));
	polygons.push_back(Point(375, 475));
	polygons.push_back(Point(25, 475));
	polylines(SrcImg, polygons, true, Scalar(255, 150, 150), Thickness, 8, 0);

	//putText function
	putText(SrcImg, "OpenCV", TextPt, FONT_HERSHEY_COMPLEX, 1.5, Scalar(0, 0, 255), Thickness, 8, false);
	circle(SrcImg, TextPt, 1, Scalar(0, 0, 255), Thickness, 8, 0);

	imshow("SrcImg", SrcImg);

	waitKey(0);
	return 0;
}
結果圖:





備註(參考資料):
1.https://docs.opencv.org/3.3.0/d6/d6e/group__imgproc__draw.html
2.https://docs.opencv.org/3.3.0/d0/de1/group__core.html#ga0f9314ea6e35f99bb23f29567fc16e11

2020年9月14日 星期一

南投清境農場2日遊(小瑞士花園、高空步道、綿羊表演)

最近剛好有機會跟家人趁休假,規劃去南投清境玩,預定行程如下:

Day1

家->熱情果大本舖->小瑞士花園->櫻花步道->紙箱王->柳杉步道->飯店

Day2

飯店->清境農場->高空步道->綿羊表演->家

-------------------Go--------------------------------Go---------------

第一站

家->熱情果大本舖->小瑞士花園->櫻花步道->紙箱王->柳杉步道->飯店

純粹是想買百香果行程,因為埔里盛產水果之一就是百香果,且聽說有工廠提供遊客現場採百香果活動,有興趣的朋友們可以自己查查~ 這邊就不詳談了

第二站

家->熱情果大本舖->小瑞士花園->櫻花步道->紙箱王->柳杉步道->飯店

這邊建議可以先將車子停在清境第一停車場,因為小瑞士花園剛好就在旁邊,當然也可以直接停在小瑞士花園內的停車場,但感覺數量比較少




停車場附近有星巴克、7-11、摩斯等店家,中午非常適合在這邊吃飯,可以直接遙望中央山脈的美景,還有說明圖可以參考呢,不過因為是在山上,所以蒼蠅比較多,建議可以找室內餐廳吃比較好





還可以跟OPEN小將拍照一下呢~原來這邊海拔1743公尺


好的,回到重點小瑞士公園,小瑞士公園位於停車場的另一方,甚至有許多家庭來這邊露營呢,有興趣的人可以找一下



售票口前的小廣場,賣的東西不多,但人潮依舊眾多


票價參考,全票平日NT$ 120 元;假日150元、優惠票平日 NT$ 90 元;假日120元、愛心票不分平假日60元、保險票不分平假日20元


歡迎來到小瑞士公園


不小心拍成過曝的兩頭羊


我個人覺得裡面的特色主要有兩個,一個就是花園,二來就是會跟音樂搭配的噴水湖畔,但老實說花的數量蠻少的,不知道是不是剛好在整修,然後人造景也很有限




四處都有魚飼料販賣機,可以嘗試餵看看,會發現魚兒總是瘋狂的飛奔過來,不知道是餓了多久,哈哈


還有遇到野貓吃魚的畫面,不過沒拍到,可惡!!
聽說這隻貓在這邊吃了很多回,有夠誇張的


裡面還有幾隻很漂亮的黑天鵝,我的老天鵝呀

還有設置給情侶們專用的拍照區


一起來敲鐘,越敲越幸福




整體來說,我覺得CP值有點不夠,因為你能看到的東西有限,而票價120元(優待票90元),當然還是因人而異啦。

第三站

家->熱情果大本舖->小瑞士花園->櫻花步道->紙箱王->柳杉步道->飯店

在前往紙箱王之前呢,跟大家快速說一下,在清境這邊有9條步道,各有各的特色,如果不想要上去又要一直找車位,可以考慮車子停在第一停車場,並用步行的方式走櫻花步道到紙箱王後,再經由柳杉步道回到停車場,此外,個人覺得步步高升步道很漂亮,但沒時間走到,下次有機會走看看。

不過因為櫻花步道走起來有點普通,所以在這邊就沒有特別放照片說明了~

到了紙箱王喔,在門口就會看到超多用紙箱做的藝術品,然後很多家庭會帶小朋友來逛








第四站

家->熱情果大本舖->小瑞士花園->櫻花步道->紙箱王->柳杉步道->飯店



還能看到小瑞士露營的地方呢~



第五站

家->熱情果大本舖->小瑞士花園->櫻花步道->紙箱王->柳杉步道->飯店

這次沒有刻意拍飯店的內容,所以就不多作介紹了~


馬上又是第二天的開始,今天就是直接殺去清境農場了

第一站

飯店->高空步道->清境農場->綿羊表演->家

這一天天氣算還不錯,但記得要擦防曬或準備放曬的衣物,免得回家變成小黑人,走在高空步道感覺真的很不錯,可以眺望遠方,彷彿可以摸到雲層般







沿途還能看到很多羊群在底下吃草,吃得真是開心




不時會有雲(還是霧??)包覆步道,瞬間讓人以為天氣變糟了呢





美美的


第二站

飯店->高空步道->清境農場->綿羊表演->家
在來回走完完高空步道之後,我們從清境的南端票口進入閒晃~


這邊跟小瑞士一樣,可以買草飼料親手餵羊妹妹,不過走在路上要隨時注意,不要誤踩羊妹妹的便便,哈哈



一堆情侶或朋友們在草地上瘋狂拍照




第三站

飯店->高空步道->清境農場->綿羊表演->家

到了下午就是清淨裡面最代表的綿羊表演了,太陽很熱情使得大家紛紛拿出雨傘來遮羞,但還是要小心不要擋到後面觀看的人



人真的超多的拉~~




主持人講話很好笑,時不時的還會帶到時事,搞得現場民眾哈哈大笑



最後不免俗的跑到門口拍照一下



總結
1.出遊要認真擦防曬,尤其是在走高空步道的時候,因為缺乏遮蔽物所以更需要保護自己
2.步步高升步道感覺很值得去,這次沒有走到有點可惜,下次一定走看看