s1083520 作業1
1112 Digital Image Processing Assignment #1
主題:圖像旋轉 Image Rotation
題目敘述
撰寫一個程式將一張圖像的 (a)整張圖像, (b)中心內切圓區域
旋轉一個角度(逆時針旋轉0度至359度):利用滑動條(trackbar)控制旋轉角度。
旋轉一個角度(逆時針旋轉0度至359度):利用滑動條(trackbar)控制旋轉角度。
開發環境
OS: Windows 10
Editor: Visual Studio Code
Compiler: GCC - 12.2.0(MinGW-W64)
Language: C++
Package: OpenCV - 4.7.0

2. cv::namedWindow(const cv::String &winname, int flags = 1) 建立視窗。
3. cv::createTrackbar(const cv::String &trackbarname,
2. cv::getTrackbarPos(const cv::String &trackbarname, const cv::String &winname)
3. cv::Mat cv::getRotationMatrix2D(cv::Point2f center, double angle, double scale)
2. 宣告cv:Mat roi,呼叫cv::Mat::copyTo(cv::OutputArray m, cv::InputArray mask) const
Editor: Visual Studio Code
Compiler: GCC - 12.2.0(MinGW-W64)
Language: C++
Package: OpenCV - 4.7.0
前置作業
1. 利用argv[]將圖片路徑作為參數傳入imread(),並宣告cv:Mat型態的變數img儲存原始圖像矩陣。2. cv::namedWindow(const cv::String &winname, int flags = 1) 建立視窗。
3. cv::createTrackbar(const cv::String &trackbarname,
const cv::String &winname,
int *value,
int count,
cv::TrackbarCallback onChang =
(cv::TrackbarCallback)0, void *userdata = (void *)0)
綁定傳入的trackbar名稱與給定的視窗名稱。
4.撰寫TrackbarCallBack function作為function pointer傳入createTrackbar function的onChange變數。
RotateImg演算法
1. cv:Mat.rows(), cv:Mat.cols()得到圖片的高(height)與寬(width),
將高與寬分別除以2得到圖片中心(center)。
2. cv::getTrackbarPos(const cv::String &trackbarname, const cv::String &winname)
得到使用者給定的旋轉角度。
3. cv::Mat cv::getRotationMatrix2D(cv::Point2f center, double angle, double scale)
傳入圖片中心、旋轉角度得到一個2x3的旋轉矩陣。
4. cv::warpAffine(cv::InputArray src,
cv::OutputArray dst,
cv::InputArray M,
cv::Size dsize,
int flags = 1,
int borderMode = 0,
const cv::Scalar &borderValue = cv::Scalar())
將圖片進行旋轉。
RotateCRImg演算法
1. 與RotateImg演算法大致上相同,但是因為RotateCR只旋轉以圖片中心為圓心的內切圓區域
因此會使用mask作為整個圖片的遮罩只擷取我們感興趣的部分ROI(Region Of Interest)
這個圓的半徑會是圖片的高與寬取最小值並除以2得到內切圓的半徑。
將原始圖像img矩陣 copy到roi並將mask傳入CopyTo這個function,此時roi則是只有內切圓區域的矩陣。
3. 將roi進行與RotateImg相同步驟操作,得到旋轉過後的內切圓區域矩陣
4. 由於copyTo function會對圖像進行變更,為了之後可能仍然需要使用的原始圖像img,
呼叫cv::Mat::clone() const,對原始圖像img矩陣進行深拷貝並賦予型態為cv:Mat的變數ret
5. 同樣呼叫cv::Mat::copyTo(cv::OutputArray m, cv::InputArray mask) const,
將roi copy到上面宣告的ret矩陣,要記得一並將mask傳入,否則得到的會是只有roi的圖像。
6. 此時ret即為最終結果
留言
張貼留言