intel made


debug with pdb

<aside> ๐Ÿ› 

๊ธฐ๋ณธ์ ‘๊ทผ : 0.์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ์ ์šฉํ•  ๋ฉ”์ธ ํšจ๊ณผ์™€ ๊ทธ ํ•จ์ˆ˜๋ฅผ ์ •ํ•˜๊ณ  1.ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ธํ’‹๊ณผ ์•„์›ƒํ’‹์„ ๊ฐœ์„ ํ•  ์ „์ฒ˜๋ฆฌ์™€ ํ›„์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋“ค์„ ์ •ํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” 2.๊ฐ€๋Šฅํ•˜๋ฉด ์ฑ„๋„์„ ๋‚˜๋ˆ„๊ณ  ์ด์ง„ํ™”๋“ฑ 3.์ ์ ˆํ•œ ๋น›/์ƒ‰๋ณด์ •์„ ํ•˜์—ฌ 4.๋Œ€์ƒ์„ ์ธ์‹ํ•œ๋‹ค.

โ†’ ์ด์ง€๋งŒโ€ฆ ํ•„ํ„ฐ๋ฅ˜๋Š” ๊ณ ๋น„์šฉ์œผ๋กœ ์‹ค์ œ๋กœ๋Š” ์™„์ „ํžˆ ์ฐฝ์˜์ ์ธ ์ ‘๊ทผ์ด ํ•„์š”ํ•˜๊ณ , cv๋Š” ๊ทธ๋Ÿด๋•Œ ์ฆ‰๊ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ๋กœ์„œ ์˜์˜๊ฐ€ ์žˆ๋‹ค.

#include <opencv2/core.hpp> #include <opencv2/opencv.hpp> #include <opencv2/videoio.hpp> #include <opencv2/highgui.hpp>

</aside>

<aside> ๐Ÿ› 

์ด๋ฏธ์ง€ํ”„๋กœ์„ธ์‹ฑ ์ฃผ์ œ๋“ค

ํ”ฝ์…€๊ธฐ๋ฐ˜์ฒ˜๋ฆฌ

.์‚ฐ์ˆ ์—ฐ์‚ฐ .ํžˆ์Šคํ† ๊ทธ๋žจํ‰ํ™œํ™” .์ด์ง„ํ™”

์˜์—ญ๊ธฐ๋ฐ˜์ฒ˜๋ฆฌ

.์ปจ๋ณผ๋ฃจ์…˜ .ํ๋ฆฌ๊ฒŒ .์„ ๋ช…ํ•˜๊ฒŒ .๊ฒฝ๊ณ„์„  .๋…ธ์ด์ฆˆ์ œ๊ฑฐ

ํ˜•ํƒœํ•™์ ์ฒ˜๋ฆฌ

.์นจ์‹ํŒฝ์ฐฝ .์—ด๋ฆผ๋‹ซํž˜

๊ธฐํ•˜ํ•™์ ์ฒ˜๋ฆฌ

.ํ™•๋Œ€ .์ถ•์†Œ .ํšŒ์ „ .๋Œ€์นญ

์˜์ƒ์›Œํ•‘&์˜์ƒ๋ชจํ•‘ ๋™์˜์ƒ์ฒ˜๋ฆฌ ์ฃผํŒŒ์ˆ˜ ์˜์—ญ ์ฒ˜๋ฆฌ

.ํ‘ธ๋ฆฌ์—๋ณ€ํ™˜ .๊ณ ์†ํ‘ธ๋ฆฌ์—๋ณ€ํ™˜ .๊ณ ์†ํ‘ธ๋ฆฌ์—์—ญ๋ณ€ํ™˜ .์ฃผํŒŒ์ˆ˜ํ•„ํ„ฐ(๊ณ ,์ €,๋…ธ์ด์ฆˆ) .์ด์‚ฐ์ฝ”์‚ฌ์ธ๋ณ€ํ™˜

์˜์ƒ์••์ถ•

.๋Ÿฐ๊ธธ์ด๋ถ€ํ˜ธํ™” .ํ—ˆํ”„๋งŒ์ฝ”๋”ฉ .jpeg

ํžˆ์Šคํ† ๊ทธ๋žจํ‰ํ™œํ™”(๊ฐ€๋กœํ‰์ค€ํ™”) ๋ช…์•”๋Œ€๋น„์ŠคํŠธ๋ ˆ์นญ(์„ธ๋กœํ‰์ค€ํ™”)

์›€์ง์ž„์ด ๋งŽ๋‹ค ์ ๋‹ค๋กœ ๋Œ€์ƒ๊ตฌ๋ถ„.. ๋บ„์…ˆ์œผ๋กœ ์ฐจ์ด ๊ตฌํ•˜๊ธฐ

๋…ธ์ด์ฆˆ์ œ๊ฑฐ -> 1.๊ฐ€์šฐ์‹œ์•ˆ์žก์Œ->ํ‰๊ท ๋งˆ์Šคํฌ 2.์ž„ํŽ„์Šค์žก์Œ->์ค‘๊ฐ„๊ฐ’ํ•„ํ„ฐ

์นจ์‹->์ปค๋„์•ˆ ์ตœ์†Œ๊ฐ’๋Œ€์ฒด ํŒฝ์ฐฝ->์ปค๋„์•ˆ ์ตœ๋Œ€๊ฐ’๋Œ€์ฒด ์—ด๋ฆผ->์นจ์‹nํ›„ ํŒฝ์ฐฝn : ํฌ๋ฏธํ•œ๋ถ€๋ถ„ ์‚ญ์ œ ๋‹ซํž˜->ํŒฝ์ฐฝnํ›„ ์นจ์‹n : ํฌ๋ฏธํ•œ๋ถ€๋ถ„ ์—ฐ๊ฒฐ

์›Œํ•‘->์—ฌ๋Ÿฌ์ œ์–ด์„ ์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค๋ฅธ ํ”ฝ์…€์˜ํ–ฅ๊ณ„์‚ฐ ๋ชจํ•‘->๋‘์ด๋ฏธ์ง€๋ฅผ ๊ฐ๊ฐ ์›Œํ•‘ํ•˜์—ฌ ์ผ์น˜์‹œํ‚ค๊ณ  (1-๊ฐ€์ค‘)ํ‰๊ท ์œผ๋กœ ๋ณ‘ํ•ฉ

</aside>

โ€ ์„ค์น˜์™€ ์„ค์ •"

์œˆ๋„์šฐ์šฉ์œผ๋กœ ๋‹ค์šด์„ ๋ฐ›๋Š”๋‹ค.

https://opencv.org/releases/

/ํ—ค๋” ๊ฒฝ๋กœ์„ค์ •/

ํ”„๋กœ์ ํŠธ ์†์„ฑ - c/c++ '์ถ”๊ฐ€ํฌํ•จ๋””๋ ‰ํ„ฐ๋ฆฌ'์— headerํŒŒ์ผ์œ„์น˜ $(SolutionDir)\opencv\build\include ์ถ”๊ฐ€ //๊ตฌ์„ฑ-ํ”Œ๋žซํผ ๋ชจ๋“ ๊ตฌ์„ฑ-x64 ์ฝ”๋“œ

/๊ตฌํ˜„๋ถ€ ๊ฒฝ๋กœ์„ค์ •/

ํ”„๋กœ์ ํŠธ ์†์„ฑ - ๋ง์ปค '์ถ”๊ฐ€ํฌํ•จ๋””๋ ‰ํ„ฐ๋ฆฌ'์— libraryํŒŒ์ผ์œ„์น˜ $(SolutionDir)\opencv\build\x64\vc16\lib ์ถ”๊ฐ€ //๊ตฌ์„ฑ-ํ”Œ๋žซํผ ๋ชจ๋“ ๊ตฌ์„ฑ-x64 CMakefile(์ปดํŒŒ์ผ์„ ์ข…ํ•ฉ์ ์œผ๋กœ ํ•˜๋‹ฌํ•˜๋Š” ์ฃผ๋ฌธ์„œ)

/๊ตฌํ˜„๋ถ€ ํŒŒ์ผ์ง€์ •/

ํ”„๋กœ์ ํŠธ ์†์„ฑ - ๋ง์ปค - ์ž…๋ ฅ '์ถ”๊ฐ€์ข…์†์„ฑ'์— ๋””๋ฒ„๊ทธ์šฉlib์ถ”๊ฐ€ opencv_world490d.lib; //๊ตฌ์„ฑ-ํ”Œ๋žซํผ ํ™œ์„ฑdebug-ํ™œ์„ฑ(x64) ๊ฐœ๋ฐœ์€64๋น„ํŠธ(ํ˜ธํ™˜์„ฑ)

ํ”„๋กœ์ ํŠธ ์†์„ฑ - ๋ง์ปค - ์ž…๋ ฅ '์ถ”๊ฐ€์ข…์†์„ฑ'์— ๋””๋ฒ„๊ทธ์šฉlib์ถ”๊ฐ€ opencv_world490.lib; //๊ตฌ์„ฑ-ํ”Œ๋žซํผ release-ํ™œ์„ฑ(x64) ๋ฐฐํฌ๋Š”32๋น„ํŠธ(๋”๋งŽ์€์‚ฌ๋žŒ์‚ฌ์šฉ)

/ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฒฝ๋กœ์„ค์ •/

ํ”„๋กœ์ ํŠธ ์†์„ฑ - ๋””๋ฒ„๊น… 'ํ™˜๊ฒฝ'์— libraryDLL(๋™์ ์—ฐ๊ฒฐlib)ํŒŒ์ผ์œ„์น˜

PATH = $(SolutionDir)\opencv\build\x64\vc16\bin; %PATH%

opencv2/opencv.hpp : ํ†ตํ•ฉ ํ—ค๋”

opencv2/core.hpp : ํ•ต์‹ฌ ํ—ค๋”, ์ด๋ฏธ์ง€ ๋ฐ ํ–‰๋ ฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ / ๊ธฐ๋ณธ์ ์ธ ์˜์ƒ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜

opencv2/imgproc.hpp : ์˜์ƒ์ฒ˜๋ฆฌ ํ—ค๋”, ์ด๋ฏธ์ง€ ํ•„ํ„ฐ๋ง/๋ชจํด๋กœ์ง€ ์—ฐ์‚ฐ/์—ฃ์ง€ ๊ฒ€์ถœ/์ƒ‰์ƒ ๋ณ€ํ™˜ ๋“ฑ

opencv2/highgui.hpp : ์ด๋ฏธ์ง€ ๋ฐ ๋น„๋””์˜ค ํŒŒ์ผ์˜ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ, ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜ ๋“ฑ GUI ๊ธฐ๋ฐ˜์˜ ๊ธฐ๋Šฅ

opencv2/videoio.hpp: ๋น„๋””์˜ค ์บก์ฒ˜ ๋ฐ ๋น„๋””์˜ค ํŒŒ์ผ์˜ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋ฅผ ์ง€์›ํ•˜๋Š” ํ—ค๋”

opencv2/features2d.hpp: ์ด๋ฏธ์ง€ ํŠน์ง• ๊ฒ€์ถœ ๋ฐ ์„ค๋ช… ํ—ค๋”, SIFT/SURF/ORB ๋“ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํฌํ•จ

opencv2/ml.hpp: ๋จธ์‹  ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ—ค๋”, SVM/k-NN ๋“ฑ์˜ ๋จธ์‹  ๋Ÿฌ๋‹ ๊ธฐ์ˆ  ์ œ๊ณต

cv::Mat : ์ด๋ฏธ์ง€๋‚˜ ํ–‰๋ ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค

cv::VideoCapture : ์นด๋ฉ”๋ผ ๋˜๋Š” ๋น„๋””์˜ค ํŒŒ์ผ์šฉ ๋น„๋””์˜ค ์บก์ฒ˜๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค

cv::VideoWriter : ๋น„๋””์˜ค๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค

cv::CascadeClassifier : ์–ผ๊ตด ๋“ฑ ๊ฐ์ฒด ๊ฐ์ง€๋ฅผ ์œ„ํ•œ Haar Cascade๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค

cv::FeatureDetector / cv::DescriptorExtractor : ์ด๋ฏธ์ง€ ํŠน์ง• ๊ฐ์ง€/์ถ”์ถœ ํด๋ž˜์Šค, SIFT/ SURF/ORB ๋“ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ง€์›

cv::ml::SVM: ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜ SVM ์‚ฌ์šฉ, ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ฐ ๊ฐ์ฒด ๊ฐ์ง€ ๋“ฑ ์ˆ˜ํ–‰ ํด๋ž˜์Šค

๋.

/*-- ๊ธฐ๋ณธ์žฌ๋ฃŒ ํ•ธ๋“ค๋ง --*/ // ํ”ฝ์…€, Mat, ์ƒ‰๊ณต๊ฐ„, roi

// Mat & pixel
cv::Mat MatImage(ํ–‰,๋ ฌ,CV_8U์ฑ„๋„์ˆ˜);
cv::Mat* MatImagePtr; ์ด๋ผ๊ณ  ํ• ๋•Œ
MatImagePtr pMatImage = std::make_shared<cv::Mat>(cv::Mat(ํ–‰,๋ ฌ,CV_8U์ฑ„๋„์ˆ˜));
/* MatImagePtr pMatImage = std::make_shared<cv::Mat>(MatImage); */

pMatImage // ์ƒ์„ฑ๋œ Mat๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
pMatImage->get() // ์ƒ์„ฑ๋œ Mat๊ฐ์ฒด
pMatImage->data() // ์ƒ์„ฑ๋œ Mat๊ฐ์ฒด์˜ ์ด๋ฏธ์ง€๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ด
pMatImage->ptr(0) // ์ƒ์„ฑ๋œ Mat๊ฐ์ฒด์˜ ์ด๋ฏธ์ง€๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ํ–‰์˜ ์‹œ์ž‘์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด (์ข€ ๋” ๊ณ ๊ธฐ๋Šฅ)

MatImage // ์ƒ์„ฑ๋œ Mat๊ฐ์ฒด
MatImage.get()
MatImage.data()
MatImage.ptr(0)

// ์ƒ‰๊ณต๊ฐ„
Mat::depth() // ๊นŠ์ด(depth) : ํ–‰๋ ฌ ์›์†Œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒํ˜• ์ •๋ณด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งคํฌ๋กœ ์ƒ์ˆ˜
#define CV_8U   0	// uchar, unsigned char // ํ˜•์‹: CV_<bit-depth>{U|S|F}
#define CV_8S   1	// schar, signed char
#define CV_16U  2	// ushort, unsigned short
#define CV_16S  3	// short
#define CV_32S  4	// int
#define CV_32F  5	// float
#define CV_64F  6	// double
#define CV_16F  7	// float16_t

Mat::channels()
// ์ฑ„๋„(channel) : ์›์†Œ ํ•˜๋‚˜๊ฐ€ ๋ช‡ ๊ฐœ์˜ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๊ฐ€?
// ํ˜•์‹ : depth + C<channels>

Mat::type()
// ํƒ€์ž…(type) : ํ–‰๋ ฌ์˜ ๊นŠ์ด์™€ ์ฑ„๋„ ์ˆ˜๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋‚˜ํƒ€๋‚ด๋Š” ๋งคํฌ๋กœ ์ƒ์ˆ˜
// ํ˜•์‹: "depth() + channels()"
CV_8UC1 // 8๋น„ํŠธ unsigned char type์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ฑ„๋„์€ 1๊ฐœ์ธ ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ ์˜์ƒ

RGB(0,255,255) ์‹œ์•ˆ์ƒ‰
RGB(255,255,0) ๋…ธ๋ž€์ƒ‰
RGB(255,0,255) ๋งˆ์  ํƒ€์ƒ‰

// ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๋ณ€ํ™˜์‹œ RGB๊ฐ€์ค‘์น˜ (์ƒ‰์ƒ์ •๋ณด์†์‹ค์„ ๋‚ดํฌ)
โ†’ ํฌํ† ์ƒต : R0.3 G0.59 B0.11
โ†’ BT.709 : R0.2126 G0.7152 B0.0722
โ†’ opencv์—์„œ๋Š” RGB์ƒ‰๊ณต๊ฐ„ํ‘œ์‹œ GRB(255,255,255)๋กœํ•จ

// HSV์ƒ‰๊ณต๊ฐ„ : ์ƒ‰์ƒHue ์ฑ„๋„Saturation ๋ช…๋„Value
โ†’ opencv์—์„œ๋Š” H0~180 S0~255 V0~255

// ROI : region of interest,  copy() copyTo()๋กœ ๋ณ„๋„๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉ
cv::Rect(start x, start y, width, height)
cv::Range(start y, end y)
cv::Range(start x, end y)
cv::Range::all()

cv::cannyedge() cv::mean() // ์‹ค์‹œ๊ฐ„ROI๊ด€์‹ฌ์˜์—ญ 

/*-- ์ฃผ์š”์ƒํ™ฉ๋ณ„ ํ•จ์ˆ˜ --*/ 

[ line ]
// points โ†’ ์ธ์ ‘์ง์„  by ์ตœ์†Œ์ œ๊ณฑ๋ฒ•: m = vy/vx, c = py - m * px
cv::fitLine( InputArray points, cv::Vec4f vxvypxpy, cv::DIST_L2, 0.0, 0.01, 0.01 );

[ curve ]
// points โ†’ ์ธ์ ‘๊ณก์„  by ์ตœ์†Œ์ œ๊ณฑ๋ฒ•:
cv::fitCurve()

// points โ†’ ๊ด€ํ†ต๊ณก์„  by ํ๋น…์Šคํ”Œ๋ผ์ธ๋ณด๊ฐ„๋ฒ•:
cv::cubicSpline()

[ distort ]
// ์ฒด์ปค๋ณด๋“œ์ธ์‹
bool findChessboardCorners( InputArray image, Size patternSize, OutputArray corners,
                                         int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE );
cv::findChessboardCorners(imgAbstracted, cvCornersizes, img2D);

// ์ธ์‹๋œ์ฒด์ปค๋ณด๋“œ๊ฐœ์„ 
cv::cornerSubPix(imgGray, img2D, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, 0.1));

// ์ธ์‹๋œ์ฒด์ปค๋ณด๋“œ๊ทธ๋ฆฌ๊ธฐ
cv::drawChessboardCorners(imgCorners, cvCornersizes, img2D, chessboardFound); //IMG_DEBUG

// ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์™œ๊ณก๋ณด์ •ํ–‰๋ ฌ
cv::calibrateCamera(list_obj3D, list_img2D, cv::Size(vvvCamImagesProcess[cam].front()[static_cast<int>(eImageProcess::ORIGIN)].rows, vvvCamImagesProcess[cam].front()[static_cast<int>(eImageProcess::ORIGIN)].cols), // TODO: ์ด๋ฏธ์ง€์‚ฌ์ด์ฆˆ ๋ณ€์ˆ˜ํ™”ํ•˜๊ธฐ
                    vCamMatrix[cam], vCamDistortionCoefficient[cam], vvCamImagesRotationVectors[cam], vvCamImagesTranslationVectors[cam]);

// ์™œ๊ณก๋ณด์ • ์ด๋ฏธ์ง€
cv::undistort(srcImage, dstImage, cameraMatrix, distortionCoefficient);

// ์™œ๊ณก๋ณด์ • ํฌ์ธํŠธ
cv::undistortPoints(temp, imagesPoints, cameraMatrix, distortionCoefficient); // ์ •๊ทœํ™”๋œ ํฌ์ธํŠธ ๋ฐ˜ํ™˜
for (int i = 0; i < imagesPoints.size(); i++) {
    imagesPoints[i].x = imagesPoints[i].x * cameraMatrix.at<double>(0, 0) + cameraMatrix.at<double>(0, 2);
    imagesPoints[i].y = imagesPoints[i].y * cameraMatrix.at<double>(1, 1) + cameraMatrix.at<double>(1, 2);
}

[ warp ]
// 4 points โ†’ ๋ณ€ํ™˜ํ–‰๋ ฌ for Trasformation( scale + rotate + move )
cv::getPerspectiveTransform(src4Points, dst4Points, retMatTransformaion);

// ๋ณ€ํ™˜ํ–‰๋ ฌ โ†’ ์ด๋ฏธ์ง€๋ณ€ํ™˜
cv::perspectiveTransform(srcPoints, dstPoints, neededMatTransformation);

// ๋ณ€ํ™˜ํ–‰๋ ฌ โ†’ ํฌ์ธํŠธ๋ณ€ํ™˜
cv::warpPerspective(srcMatImage, dstMatImage, neededMatTransformation);

// ๋ณ€ํ™˜ํ–‰๋ ฌ ๊ณ„์‚ฐ (๋‹ค์ : ๋‹คํ•ญ์‹, 4์ : perspective)
cv::Mat transform;
if (n == 4) {
    transform = cv::getPerspectiveTransform(srcPoints, dstPoints);
} else {
    transform = cv::estimateAffinePartial2D(srcPoints, dstPoints);
}
/*-- UI --*/ 
// ํŠธ๋ž™๋ฐ” 

// ํ‚ค๋ณด๋“œ์ด๋ฒคํŠธ 

// ๋งˆ์šฐ์Šค์ด๋ฒคํŠธ 

// ํ•œ ์ฐฝ๋‚ด ์—ฌ๋Ÿฌ์ด๋ฏธ์ง€

/*-- ImageProcessing --*/ 
// ์ด์ง„ํ™”
threshold(grayimage, thresh, maxval, Type); // ์ „์—ญ์ž„๊ณ„๊ฐ’
adaptiveThreshold(grayimage, maxval, ADAPTIVE_method, Type, blocksize, ๋ณด์ •์ƒ์ˆ˜C); // ์ ์‘ํ˜•์ด์ง„ํ™”

// ์ด๋ฏธ์ง€์—ฐ์‚ฐ
addWeighted() // ๋ธ”๋žœ๋”ฉ
subtract() // ์ฐจ์˜์ƒ
bitwise_and() bitwise_not() // ์ด๋ฏธ์ง€๋น„ํŠธ์—ฐ์‚ฐ
addWeighted(ํŒŒ์ผ1, double Weight1, ํŒŒ์ผ2, double Weight2, double Both์ถ”๊ฐ€์ƒ์ˆ˜, ๊ฒฐ๊ณผ๋ฐฐ์—ด, int dtype =-1) //dtype์ถœ๋ ฅ๋ฐฐ์—ด๊นŠ์ด ํŒŒ์ผ1๊นŠ์ด๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ, ์ƒ๋žต๊ฐ€๋Šฅ
subtract(ํŒŒ์ผ1, ํŒŒ์ผ1๋ฐฐ๊ฒฝ, ๊ฒฐ๊ณผ์ €์žฅ);
bitwise_not(ํŒŒ์ผ1,๋ฐ˜์ „๊ฒฐ๊ณผ์ €์žฅ,๋ฒ”์œ„๋งˆ์Šคํฌ) 
bitwise_and(ํŒŒ์ผ1,ํŒŒ์ผ2,๋ฒ”์œ„๋งˆ์Šคํฌ)
bitwise_not(m_MimageCanny, m_MimageCanny); // ์ƒ‰์ƒ๋ฐ˜์ „

// ๊ทธ๋ฆฌ๊ธฐ
rng.uniform(0,256) // ๋‚œ์ˆ˜์ƒ์„ฑ(๋žœ๋ค์ƒ‰) 
retangle(Mat๋ฐฐ๊ฒฝ, Point์ขŒ์ƒ๋‹จ, Point์šฐํ•˜๋‹จ, Scalar์ƒ‰์ƒ, int๊ตต๊ธฐ) // ์‚ฌ๊ฐํ˜•๊ทธ๋ฆฌ๊ธฐ 
circle(Mat๋ฐฐ๊ฒฝ, Point์ค‘์‹ฌ, int๋ฐ˜์ง€๋ฆ„, Scalar์ƒ‰์ƒ, int๊ตต๊ธฐ) // ์›๊ทธ๋ฆฌ๊ธฐ
line(Mat๋ฐฐ๊ฒฝ, Point์‹œ์ž‘์ , Point๋์ , Scalar์ƒ‰, int๊ตต๊ธฐ) // ์„ ๋ถ„๊ทธ๋ฆฌ๊ธฐ
ellipse(Mat๋ฐฐ๊ฒฝ, Point์ค‘์‹ฌ, Size์ถ•๋ฐ˜์ง€๋ฆ„, doubleํƒ€์›๊ธฐ์šธ๊ธฐ, double์‹œ์ž‘๊ฐ(0), double๋๊ฐ(360), Scalar์ƒ‰์ƒ, int๊ตต๊ธฐ) // ํƒ€์›๊ทธ๋ฆฌ๊ธฐ 
polylines(Mat๋ฐฐ๊ฒฝ, Point**๊ผญ์ง“์ ๋ฐฐ์—ด, int* ๊ผญ์ง“์ ์ˆ˜, int๊ทธ๋ฆด ์ˆ˜, bool๋‹ซํž˜์—ฌ๋ถ€, Scalar์ƒ‰์ƒ, int๊ตต๊ธฐ, int์„ ํƒ€์ž…(8,1~12), int์ขŒํ‘œ์†Œ์ˆ˜์ ์ดํ•˜๋น„ํŠธ์ˆ˜(0) ) //ํด๋ฆฌ๊ณค๊ทธ๋ฆฌ๊ธฐ 
fillPoly(Mat๋ฐฐ๊ฒฝ, Point**๊ผญ์ง“์ ๋ฐฐ์—ด, int* ๊ผญ์ง“์ ์ˆ˜, int๊ทธ๋ฆด์ˆ˜, Scalar์ƒ‰์ƒ, int์„ ํƒ€์ž…(8), int์ขŒํ‘œ์†Œ์ˆ˜์ ์ดํ•˜๋น„ํŠธ์ˆ˜(0), Point์˜คํ”„์…‹ ) // ์ƒ‰์ฑ„์šฐ๊ธฐ
putText(Mat์ด๋ฏธ์ง€, string"๋‚ด์šฉ", Point์œ„์น˜, intํฐํŠธ, doubleํฐํŠธ์Šคํƒ€์ผ, Scalar์ƒ‰์ƒ, int๋‘๊ป˜) //๊ธ€์ž์ถœ๋ ฅ 

// ๊ธฐํ•˜ ๋ณ€ํ™˜
warpAffine(Mat _in, Mat _out, getRotationMatrix2D(Point _center, double _angle, double _scale), Size(int _width, int _height)) // rotate 
resize(Mat _in, Mat _out, Size(), double _Xratio, double _Yratio, int ๋ณด๊ฐ„๋ฒ• = INTER_LINEAR) // scale 
warpAffine(Mat _in, Mat _out, Mat (Mat_<float>(2, 3) << 1, 0, m_fX, 0, 1, m_fY), Size(int _width, int _height)) // traslate 
warpAffine(Mat _in, Mat _out, getAffineTransform(Point2f m_affine0, Point2f m_affine1), Size(width, height)) // 3์ -ํ•œ์ถ•๊ธฐ์šธ์ด๊ธฐ
warpPerspective(Mat _in, Mat _out, getPerspectiveTransform(Point2f m_perspective0, Point2f m_perspective1), Size(width, height)) // 4์  shouldbe ์œ„์น˜๋กœ ํŽผ์น˜๊ธฐ

// ์ปจ๋ณผ๋ฃจ์…˜, ๋งˆ์Šคํฌ : Mat๋งˆ์Šคํฌ์ค‘์•™์ ์ด ์œ„์น˜ํ•œ Mat์›๋ณธ์˜ _outr๊ฐ’์„ ๋งˆ์Šคํฌ์˜ ๊ฐ ์ ๊ณผ ๊ณฑํ•œํ›„ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ• / ๊ฐ€์žฅ์ž๋ฆฌ๋Š” 0์œผ๋กœ ๊ฐ„์ฃผ(ํŒจ๋”ฉ)ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ’์œผ๋กœ ๋ฒ—์–ด๋‚œ๊ฐ’๊ณ„์‚ฐ
filter2D(Mat _in, Mat _out, Mat ์ปค๋„(cols, rows, CV_32F, -1, Scalar(1/(cols*rows).0) ) // ๋ธ”๋Ÿฌ๋ง : ๋…ธ์ด์ฆˆ์ œ๊ฑฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ปจ๋ณผ๋ฃจ์…˜, ํ๋ ค์ง€์ง€๋งŒ ๋…ธ์ด์ฆˆ๋„ ์‚ฌ๋ผ์ง
blur(Mat _in, Mat _out, Size (cols,rows)) // ํ‰๊ท ๋ธ”๋Ÿฌ๋ง, ์ปค๋„ํ•„์š”์—†๋Š” ๊ธฐ๋ณธ์ œ๊ณตํ•จ์ˆ˜
GaussainBlur(Mat _in, Mat _out, Size (cols,rows),0) // ๊ฐ€์šฐ์‹œ์•ˆ๋ธ”๋Ÿฌ๋ง, Mat๋งˆ์Šคํฌ์ค‘์•™์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๊ฐ€์ค‘์น˜๋ถ€์—ฌ
medianBlur(Mat _in, Mat _out, int ์ •์‚ฌ๊ฐ์ปค๋„ํ•œ๋ณ€์˜๊ธธ์ด) // ์ค‘๊ฐ„๊ฐ’๋ธ”๋Ÿฌ๋ง, ๊ด€์‹ฌํ™”์ˆ˜ ์ฃผ๋ณ€ ์ง€์ •ํ•œ ๋งˆ์Šคํฌ๋‚ด์˜ ํ”ฝ์…€์„ ํฌ๊ธฐ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œํ›„ ์ค‘๊ฐ„๊ฐ’์„ ๋ฐ˜ํ™˜, ๋ฌด์ž‘์œ„ ๋…ธ์ด์ฆˆ์ œ๊ฑฐ์— ํšจ๊ณผ์ 
bilateralFilter(Mat _in, Mat _out, int ๊ฐํ”ฝ์…€์ด์›ƒ์ง๊ฒฝ, double ์ƒ‰์‹œ๊ทธ๋งˆ, double ๊ณต๊ฐ„์‹œ๊ทธ๋งˆ, int ๊ฒฝ๊ณ„์ฒ˜๋ฆฌ๋ฐฉ์‹ = BORDER_DEFAULT) // ์–‘๋ฐฉํ–ฅํ•„ํ„ฐ๋ง, ์—์ง€ ๋ณด์กดํ•˜๋ฉด์„œ ๋…ธ์ด์ฆˆ ๊ฐ์†Œ,
Sobel(Mat _in๋ณดํ†ต๊ทธ๋ ˆ์ด, Mat_out, CV_64F, n์—‘์Šค๋ฐฉํ–ฅn์ฐจ๋ฏธ๋ถ„, n์™€์ด๋ฐฉํ–ฅn์ฐจ๋ฏธ๋ถ„, ์ •์‚ฌ๊ฐ์†Œ๋ฒจ์ปค๋„ํ•œ๋ณ€์˜๊ธธ์ด30๋ฏธ๋งŒํ™€์ˆ˜) // ์†Œ๋ฒจ๊ฒ€์ถœ๋ฒ•: ํ”ฝ์…€๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ธฐ์šธ๊ธฐ(๋ฏธ๋ถ„)๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์ถœ, ์œˆ๋„์šฐ์—์„œ ๋ณด๋ ค๋ฉด ์†Œ๋ฒจ์ด๋ฏธ์ง€๋ฅผ 8๋น„ํŠธ UINT๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•จ convertScaleAbs(Mat _in, Mat _out);
canny() // ์—์ง€๊ฒ€์ถœ ์บ๋‹ˆ๊ฒ€์ถœ๋ฒ• : blur3x3๊ณผ ๊ถํ•ฉ์ด ์ข‹์Œ

// ๋ชจํด๋กœ์ง€ : ์นจ์‹-ํŒฝ์ฐฝ, ํฐ์ƒ‰ ๋˜๋Š” ๊ฒ€์€์ƒ‰ ์˜์—ญ์˜ ํ˜•ํƒœ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ž„(์™ธ๊ณฝ์„ ๋ฐ˜๋Œ€์ƒ‰์œผ๋กœ ์ฒ˜๋ฆฌ...๋…ธ์ด์ฆˆ์ œ๊ฑฐ ์„ ๋ช…๋„ ๊ฐœ์„ ๋“ฑ) : Erosion / Dilation / Opening / Closing
// iterations = 1 ์ปค์Šคํ…€ํ•ด์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ˜๋ณต์ ์šฉํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Œ, ๋ชจํด๋กœ์ง€ ์—ฐ์‚ฐ์—์„œ ํŒฝ์ฐฝ/์นจ์‹์˜ ๊ฐœ๋…์Œ ํฐ์ƒ‰(๋น›์ด ์žˆ์Œ)์„ ๊ธฐ์ค€์œผ๋กœ ํ•จ.
erode(Mat _in๋ณดํ†ต๊ทธ๋ ˆ์ด, Mat _out, Mat(getStructuringElement(MORPH_RECT, Size(3, 3))) ) // Erosion(์นจ์‹) ๋ฒ”์œ„๊ตฌ์กฐ์š”์†Œ๋‚ด ๋ชจ๋“  ํ”ฝ์…€์ด 1(ํฐ์ƒ‰)์ธ ๊ฒฝ์šฐ๋งŒ ํฐ์ƒ‰์œ ์ง€ํ•˜๋Š” ์—ฐ์‚ฐ
dilate(Mat _in๋ณดํ†ต๊ทธ๋ ˆ์ด, Mat _out, Mat(getStructuringElement(MORPH_RECT, Size(3, 3))) ) // Dilation(ํŒฝ์ฐฝ) ๋ฒ”์œ„๊ตฌ์กฐ์š”์†Œ๋‚ด ๋ชจ๋“  ํ”ฝ์…€๊ฐ’ ์ค‘ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ํ•ด๋‹น ํ”ฝ์…€์„ ๋Œ€์ฒด ์—ฐ์‚ฐ
morphologyEx(m_MimageGray, m_MimageColorTemp, MORPH_OPEN, Mat(getStructuringElement(MORPH_RECT, Size(3, 3))) ); // Opening(๋…ธ์ด์ฆˆ์ œ๊ฑฐ) ์ผ๋กœ์ ผํ›„ ๋”œ๋ ˆ์ด์…˜.. ํฐ์ƒ‰์ฃผ์œ„๋ฅผ ๊ฒ€์ •์œผ๋กœ ํ–ˆ๋‹ค๊ฐ€ ๊ฒ€์ • ์ฃผ์œ„๋ฅผ ํฐ์ƒ‰์œผ๋กœ 
morphologyEx(m_MimageGray, m_MimageColorTemp, MORPH_CLOSE, Mat(getStructuringElement(MORPH_RECT, Size(3, 3)))); // Closing(๋นˆ๊ณต๊ฐ„์—†์• ๊ธฐ) ๋”œ๋ ˆ์ด์…˜ํ›„ ์ผ๋กœ์…˜.. ๊ฒ€์ •์ฃผ์œ„๋ฅผ ํฐ์ƒ‰์œผ๋กœ ํ–ˆ๋‹ค๊ฐ€ ํฐ์ƒ‰ ์ฃผ์œ„๋ฅผ ๊ฒ€์€์ƒ‰์œผ๋กœ 

// ํ—ˆํ”„๋ณ€ํ™˜ : ์นด๋ฅดํ…Œ์ง€์•ˆ ์ขŒํ‘œ๊ณ„( y = a x + b )์˜ ์ง์„ ์„ ๊ทน์ขŒํ‘œ๊ณ„( r = x sin ฮธ + y cos ฮธ )๋กœ ์˜ฎ๊ฒจ, (x,y)์— ๋Œ€ํ•ด ์ง์„ ์ด ๊ฐ€๋Šฅํ•œ(r,ฮธ) ์กฐํ•ฉ์„ ๋ฐฐ์—ด์— ํžˆ์Šคํ† ๊ทธ๋žจ์‹์œผ๋กœ ๋ˆ„์ ํ•˜๊ณ  ์ผ์ • threshold์ด์ƒ์„ ๊ต์ฐจ์ง์„ ์œผ๋กœ ํŒ๋‹จ
// ์นด๋ฅดํ…Œ์ง€์•ˆ ์ขŒํ‘œ๊ณ„(๋ฐ์นด๋ฅดํŠธ ์ขŒํ‘œ๊ณ„) : ์œ ํด๋ฆฌ๋“œ๊ณต๊ฐ„์„ ์ขŒํ‘œ๊ณ„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ˜„์žฌ์œ„์น˜๋ฅผ ์ •์ˆ˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ‘œ์‹œ, ์ฃผ๋กœ 2D
// ๊ทน ์ขŒํ‘œ๊ณ„ : ํ‰๋ฉด์œ„์˜ ์œ„์น˜๋ฅผ ๊ฐ๋„์™€ ๊ฑฐ๋ฆฌ๋ฅผ ์จ์„œ ํ‘œํ˜„
// ์žฅ์  :: ๋ฐ์นด๋ฅดํŠธ์ขŒํ‘œ์—์„œ๋Š” ์—ฌ๋Ÿฌ์ ๋“ค์—๋Œ€ํ•ด์„œ ๋ฌดํ•œa & ๋ฌดํ•œb ์กฐํ•ฉ์„ ๊ณ ๋ คํ•ด์•ผํ•˜์ง€๋งŒ, ๊ทน์ขŒํ‘œ์—์„œ๋Š” ๋ฌดํ•œr & 180๋„ฮธ๋งŒ ๊ณ ๋ คํ•˜๋ฉด๋จ.
// ฮธ๊ฐ€ 0,0์„ ๊ธฐ์ค€์ ์œผ๋กœ ์ œํ•œ์ด ์žˆ๋Š” ๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ(๊ฐ๋„๋ผ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์ด๋ฏธ ๋‘์„ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋‚ดํฌํ•˜๋Š” ๊ฐœ๋…) + ์‹ฌ์ง€์–ด ๋ฌดํ•œr๋„ double 0~1 ๊ฐ’์œผ๋กœ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ๊ณ„์‚ฐ..
// ๋‹จ์  :: ๋ชจ๋“ ํ”ฝ์…€์— ๋Œ€ํ•ด ๊ฒ€์‚ฌ๋กœ ๋‹ค์†Œ ๋А๋ฆผ

HoughLines(Mat _in์บ๋‹ˆ(8๋น„ํŠธ๋ฐ”์ด๋„ˆ๋ฆฌ!), vecter<Vec2f> _out, 1 (double ํ”ฝ์…€๋‹จ์œ„๊ฐ„๊ฒฉ), CV_PI / 180(๋ผ๋””์•ˆ1๋„, ฮธ๋‹จ์œ„๊ฐ„๊ฒฉ), int threshold ); // ์„ ๊ฒ€์ถœ(ํ—ˆํ”„๋ผ์ธ์ด๋™)HoughLines : ๋ชจ๋“ ์ ์— ๋Œ€ํ•ด ์„ ๊ณ„์‚ฐ
HoughLineP(Mat _in์บ๋‹ˆ(8๋น„ํŠธ๋ฐ”์ด๋„ˆ๋ฆฌ!), vecter<Vec2f> _out, 1 (double ํ”ฝ์…€๋‹จ์œ„๊ฐ„๊ฒฉ), CV_PI / 180(๋ผ๋””์•ˆ1๋„, ฮธ๋‹จ์œ„๊ฐ„๊ฒฉ), int threshold, double ๊ฒ€์ถœ์ง์„ ์˜ ์ตœ์†Œ๊ธธ์ด, double ์ง์„ ์„๊ตฌ์„ฑํ•˜๋Š”์  ์‚ฌ์ด์˜ ์ตœ๋Œ€๊ฑฐ๋ฆฌ ); // ์„ ๊ฒ€์ถœ(ํ—ˆํ”„๋ผ์ธ์ด๋™)HoughLineP : ์ž„์˜์˜ ์ ์— ๋Œ€ํ•ด ์„ ๊ณ„์‚ฐ
HoughCircles(Mat _in๊ทธ๋ ˆ์ด!, vector<Vec3f> _circles, HOUGH_GRADIENT, 1 (๊ณ„์‚ฐํ•ด์ƒ๋„์˜ ์—ญ์ˆ˜), 20 (๊ฒ€์ถœ๋œ ์›์‚ฌ์ด ์ตœ์†Œ๊ฑฐ๋ฆฌ), double ์บ๋‹ˆThresh=50, double CircleThresh=35, int minRadius=0, int maxRadius=0) // ์›๊ฒ€์ถœ(ํ—ˆํ”„์„œํด์ด๋™)HoughCircles : ์—์ง€๊ฒ€์ถœ๊ธฐ๋Šฅ ๋‚ดํฌ

// ํžˆ์Šคํ† ๊ทธ๋žจ ๊ตฌํ•˜๊ธฐ : ๋ฐ๊ธฐ์— ๋”ฐ๋ฅธ ํ”ฝ์…€์ˆ˜ ๋ถ„ํฌ
calcHist(&bgr_channels[0], int 1์ž…๋ ฅ๊ฐฏ์ˆ˜, int* 0์ฑ„๋„๊ฐฏ์ˆ˜, Mat()๋งˆ์Šคํฌ์ด๋ฏธ์ง€(_in, ()์ด๊ฑด์ „์ฒด), Mat _out, int 1์ถœ๋ ฅ์ฐจ์›์ฐจ์›์ˆ˜, int* &iHist_Size๊ฐ๋ฐฐ์—ดํฌ๊ธฐ, float** &pfHist_Range, bBarUniform๊ท ๋“ฑ๊ฐ„๊ฒฉ์—ฌ๋ถ€, bAccumulate๋ˆ„์ or์ดˆ๊ธฐํ™”์—ฌ๋ถ€);
normalize(m_Mhist_gray, m_Mhist_gray, 0, m_MimageHistogram.rows, NORM_MINMAX, -1, Mat());
for() + line(m_MimageHistogram, Point(i, height / 3 * 1 - cvRound(m_Mhist_gray.at<float>(i)) / 3), Point(i, (height - 0) / 3 * 1), Scalar(255, 255, 255), 2);
if(bpp == 24) split(m_MimageColorTemp1, bgr_channels); calcHist(&bgr_channels[0], 1, 0, Mat(), m_Mhist_b, 1, &iHist_Size, &pfHist_Range, bBarUniform, bAccumulate); 
equalizeHist(m_Mhist_gray, m_Mhist_equalize); // ํžˆ์Šคํ† ๊ทธ๋žจํ‰ํ™œํ™”
Ptr<CLAHE> _= createCLAHE(); ->setClipLimit(2.0); ->setTilesGridSize(Size(8,8)); ->apply(Mat _in, Mat _out); // ์ ์‘ํ˜•ํžˆ์Šคํ† ๊ทธ๋žจํ‰ํ™œํ™”, _out์„ ์ธ์ž๋กœํ•˜์—ฌ ํžˆ์Šคํ† ๊ทธ๋žจ๊ตฌํ•˜๊ธฐ calHist์— ๋Œ€์ž….

// ํ…œํ”Œ๋ฆฟ๋งค์นญ
1๊ฐœ ๊ฒ€์ถœ matchTemplate() + minMaxLoc()
ใ„ด1. matchTemplate(Mat _grayBG, Mat _grayTemplate, Mat _detected, TM_CCOEFF_NORMED); //์ผ์น˜์ •๋„๋ฅผ 0~1๋กœ ์ €์žฅ, ํฌ๊ฒŒ ์ด3๊ฐ€์ง€ ์ •๋„ TM_ ๋ฐฉ์‹์ด ์žˆ์Œ
ใ„ด2. minMaxLoc(Mat _detected, &dMinVal, &dMaxVal, &Pminpnt, &Pmaxpnt);
ใ„ด3. rectangle(Mat _out, Ptopleft, Pbottomright, (0, 0, 255), 2);
์—ฌ๋Ÿฌ๊ฐœ ๊ฒ€์ถœ matchTemplate() + vector<Point> _detected()
ใ„ด1. matchTemplate() ๋™์ผ
ใ„ด2. notNearInList()ํ•จ์ˆ˜๋งŒ๋“ค์–ด์„œ ๊ฒ€์‚ฌํ•˜๊ณ  vector<Point> m_PVdetected;์— ์ €์žฅ
ใ„ด3. x,y์ „์ฒด์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋ฌธ if(Mat _detected.at<float>(y,x) > 0.9 && notNearInList(Point(x,y))) { PV๊ฒ€์‚ฌ๋ฐฐ์—ด.push_back(Point(x, y)); + ์‚ฌ๊ฐํ˜•๊ทธ๋ฆฌ๊ธฐ }

[15์˜์ƒ๋ถ„ํ• ] : ์ด์ง„ํ™”, HSV์ƒ‰๊ณต๊ฐ„๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹
HSV๋งˆ์Šคํฌ : inRange(์ด์ง„๋งˆ์Šคํฌ๋ฐ˜ํ™˜)+bitwise_and(์ƒ‰์ •๋ณด์‚ด๋ฆฌ๊ธฐ) == HSVmask
ใ„ด์ธก์ •์ค‘์‹ฌ์˜ RGB 3์ฑ„๋„์„ ์ธ์‹์ค‘์‹ฌ์˜ HSV 3์ฑ„๋„๋กœ ๋ฐ”๊ฟ”์คŒ(H์ƒ‰์กฐ 0~179๊ตฌ๊ฐ„ / S์ฑ„๋„ 0~255 / V๋ช…๋„ 0~255 ์œผ๋กœ ํ‘œํ˜„)
๋ผ๋ฒจ๋ง : ํƒฌํ”Œ๋ฆฟ์ฐพ๊ธฐx ์ด์ง„์ด๋ฏธ์ง€์—์„œ ์—ฐ๊ฒฐ๋œ ํ”ฝ์ƒ์ฐพ๊ธฐ
ใ„ดconnectedComponentsWithStats(Mat _in๊ทธ๋ ˆ์ด, Mat _out๋ ˆ์ด๋ธ”์ด๋ฏธ์ง€, Mat _stats๊ฐ๊ตฌ์„ฑ์š”์†Œ์˜๋‚ด์šฉ, Mat _centroids๊ฐ๊ตฌ์„ฑ์š”์†Œ์˜์ค‘์‹ฌ์ )
๋ฐฐ๊ฒฝ์ œ๊ฑฐ : ๋ฐฐ๊ฒฝ์ดฌ์˜ํ›„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ๊ฒ€์ถœ BackgroundSubtraction
ใ„ดPtr<BackgroundSubtractorMOG2> foregroundBG = createBackgroundSubtractorMOG2(500์ด์ „ํ”„๋ ˆ์ž„๊ณ ๋ ค์ˆ˜, 250๋ฐฐ๊ฒฝ-๋ชจ๋ธ๊ฐ„ ๋ถ„์‚ฐ์ž„๊ณ„๊ฐ’, false๊ทธ๋ฆผ์žํƒ์ง€์—ฌ๋ถ€);
ใ„ด_in์— ๊ฐ€์šฐ์‹œ์•ˆ ์ ์šฉํ•ด์„œ ์ข€๋” ๋งค๋„๋Ÿฝ๊ฒŒ
ใ„ดforegroundBG->apply(Mat _in, Mat _out, 0ํ•™์Šต๋ฅ ๋กœ๋ฐฐ๊ฒฝ๋ชจ๋ธ๊ฐฑ์‹ ์ฃผ๊ธฐ์™€๋น„๋ก€);
ใ„ด_out์— ๋ชจํด๋กœ์ง€closing ์ ์šฉํ•ด์„œ ์ข€ ๋” ๊ฒฝ๊ณ„๋ฅผ ๋šœ๋ ทํ•˜๊ฒŒ

[16์ปจํˆฌ์–ด] : ํŠน์ •์˜์—ญ๊ฒฝ๊ณ„์˜ ๊ฐ™์€ ํ”ฝ์…€๊ฐ’์„ ์—ฐ๊ฒฐํ•œ ์„ , ์™ธ๊ฐ์„ ๋ณด๊ฐ•์šฉ์œผ๋กœ๋„ ์“ฐ์ž„
์ปจํˆฌ์–ด์ฐพ๊ธฐ findContours(m_MimageCanny.clone(), PVVcontour, RETR_LIST, CHAIN_APPROX_SIMPLE);
์ธ์ž1: ์›๋ณธ์„ ์ˆ˜์ •ํ•˜๊ธฐ๋•Œ๋ฌธ์— clone()ํ™œ์šฉ, ๋‹จ ๊ฒฐ๊ณผ๋Š” PVVcontour์— ์ €์žฅํ•จ์œผ๋กœ ๋ณ„๋„ ๋ณ€์ˆ˜๋Š”x
์ธ์ž2: ์œค๊ณฝ์„  ๊ฒ€์ƒ‰ ๋ชจ๋“œ
ใ„ดRETR_EXTERNAL: ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ์˜ ์œค๊ณฝ์„ ๋งŒ ๊ฒ€์ƒ‰
ใ„ดRETR_LIST: ๋ชจ๋“  ์œค๊ณฝ์„ ์„ ๊ฒ€์ƒ‰, ๊ณ„์ธต ๊ตฌ์กฐx
ใ„ดRETR_CCOMP: ๋ชจ๋“  ์œค๊ณฝ์„ ์„ ๊ฒ€์ƒ‰, ๊ณ„์ธต ๊ตฌ์กฐ 2๋‹จ๊ณ„
ใ„ดRETR_TREE: ๋ชจ๋“  ์œค๊ณฝ์„ ์„ ๊ฒ€์ƒ‰, ๋ชจ๋“  ๊ณ„์ธต ๊ตฌ์กฐ
์ธ์ž3: ์œค๊ณฝ์„  ๊ทผ์‚ฌ ๋ฐฉ๋ฒ•
ใ„ดCHAIN_APPROX_NONE: ๋ชจ๋“  ์œค๊ณฝ์„  ํฌ์ธํŠธ๋ฅผ ์ €์žฅ
ใ„ดCHAIN_APPROX_SIMPLE: ์œค๊ณฝ์„ ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ํฌ์ธํŠธ๋งŒ ๋ฐ˜ํ™˜/ ๊ผญ์ง“์ ๋งŒ ๋ฐ˜ํ™˜,๋ฉ”๋ชจ๋ฆฌ์ ˆ์•ฝ
์ปจํˆฌ์–ด๊ทธ๋ฆฌ๊ธฐ drawContours(m_MimageCanny, PVVcontour, -1, Scalar(0, 0, 0), 1); //-1์€ ๋ชจ๋“  ์œค๊ณฝ์„ 
์ปจํˆฌ์–ด๊ทผ์‚ฌํ™” approxPolyDP(์ž‘์—…๋Œ€์ƒPVVcontours[i], ์ €์žฅํ• ๊ณณapproxPVcontour, double ํŽธ์ฐจ0.003 * arcLength(PVVcontours[i], true), true);
์ปจํˆฌ์–ด๋ฌด๊ฒŒ์ค‘์‹ฌ moments() : ์ปจํˆฌ์–ด ์ฃผ๋ฉด ํ†ต๊ณ„์  ๊ณ„์‚ฐํ•จ
ใ„ดapxMPVcontour = moments(approxPVVcontours[i]);
ใ„ดint contourX = static_cast<float>(apxMPVcontour.m10 / (apxMPVcontour.m00 + 1e-5)); //1e-5 == 10^(-5) ์•„์ฃผ์ž‘์€์ˆ˜,๋ถ„๋ชจ0๋ฐฉ์ง€
ใ„ดint contourY = static_cast<float>(apxMPVcontour.m01 / (apxMPVcontour.m00 + 1e-5)); //๊ฐ๊ฐ ์ปจํˆฌ์–ด์˜ ๊ตฌ์„ฑ ํฌ์ธํŠธ๋“ค์˜ x๊ฐ’์„ ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๊ธฐ์ค€ ๊ฐ€์ค‘์น˜์ค˜์„œ ํ•ฉํ•œ๊ฐ’ / ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํฌ์ธํŠธ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ•ฉํ•œ๊ฐ’(๋ชจ์ˆ˜) == ๊ฐ€์ค‘ํ‰๊ท  (๋ชจ๋“  x๋ฅผ ๊ฐ€์ค‘ํ•ฉ์‚ฐํ•˜๊ณ , ๋ชจ์ˆ˜๋กœ ๋‚˜๋ˆ ์คŒ)
๊ฒฝ๊ณ„์‚ฌ๊ฐํ˜• boundingRect(approxPVVcontours[i]); ์ปจํˆฌ์–ด๋ฅผ ์ฃผ๋ฉด Rect๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  rectangle๋กœ ๊ทธ๋ฆฌ๊ธฐ / minAreaRect() ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‚˜ RotatedRect๋ฐ˜ํ™˜ํ•จ
์™ธ๊ฐํด๋ฆฌ๊ณค ConvexHull() ์ปจํˆฌ์–ด๋ฌถ์Œ์—์„œ ์ปจํˆฌ์–ด๋ฅผ ๊บผ๋‚ด์ฃผ๋ฉด, ํ—์„ ๋ฐ˜ํ™˜
ใ„ดconvexHull(Mat(approxPVVcontours[i]), PVhull, true, true);
ใ„ดPVVhull.push_back(PVhull);
ํด๋ฆฌ๊ณค์˜๋‚ด๊ฐ์  ConvexityDefects() ์ปจํˆฌ์–ด๋ฌถ์Œ์—์„œ ๊บผ๋‚ธ ์ปจํˆฌ์–ด์™€ ํ•ด๋‹นํ•˜๋Š” ํ—์„ ์ฃผ๋ฉด, '๋ณผ๋ก์„ฑ ๊ฒฐํ•จ' ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ Defects[] = {๊ฒฐํ•จ์‹œ์ž‘์ a, ๊ฒฐํ•จ๋์ b, ๊ฒฐํ•จ๋‚ด๊ฐ€์žฅ๋จผ์ far, ๊ฒฐํ•จ์˜๊นŠ์ดdepth}
ใ„ดconvexityDefects(approxPVVcontours[i], iVhull, Vdefects);
ใ„ดPoint a = approxPVVcontours[i][Vdefects[j][0]];
ใ„ดPoint b = approxPVVcontours[i][Vdefects[j][1]];
ใ„ดPoint far = approxPVVcontours[i][Vdefects[j][2]];
ใ„ดint distance = Vdefects[j][3];
์ปจํˆฌ์–ด๋ฉด์  contourArea(approxPVVcontours[i]); ๋ฉด์ ์„ double๋กœ ๋ฐ˜ํ™˜

[17๋ฌผ์ฒด์ถ”์ ] : calcBackProject()๊ฐ€ ํ•ต์‹ฌ, ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์„ฑ๋Šฅ์ด ์–ด๋–ป๋“ ๊ฐ„์—, ์ƒ‰๊ธฐ๋ฐ˜ ํžˆ์Šคํ† ๊ทธ๋žจ์œผ๋กœ ํ™•๋ฅ ์ •๋ณด ๋งตํ•‘ํ•ด์„œ ์ถ”์ ํ•˜๊ฒŒ ๋จ, CamShift/meanShift๋Š” ๋‹จ์ˆœํžˆ ๊ทธ๋ฆฌ๊ธฐ ๋„๊ตฌ์— ์ง€๋‚˜์ง€ ์•Š์Œ
cvtColor๋กœHSV๋ณ€ํ™˜+HSV์—์„œ,์„ค์ •ํ•œRect์˜Mat๊ด€์‹ฌ์˜์—ญ์„ ์žก์•„์ฃผ๊ณ +calcHist(),normalize()ํ•ด์„œ ํžˆ์Šคํ† ๊ทธ๋žจํ™”ํ•ด์คŒ+"""calcBackProject()"""๋กœ ๋ฐฐ๊ฒฝHSV์—์„œ ๊ด€์‹ฌ์˜์—ญhistogram์˜ ์กด์žฌํ™•๋ฅ ๊ณ„์‚ฐ+"""CamShift()"""์— ํ™•๋ฅ ๋งต๊ณผ ๊ด€์‹ฌ์˜์—ญ์ •๋ณด๋„ฃ๊ณ  line()์œผ๋กœ ์ถ”์ ์‚ฌ๊ฐํ˜•๊ทธ๋ฆฌ๊ธฐ
ใ„ดcvtColor(m_MimageColor, m_MimageHSV, COLOR_BGR2HSV);
ใ„ดcalcBackProject(๋ฐฐ๊ฒฝ&m_MimageHSV, ์ฑ„๋„์ˆ˜1, ์—ญํˆฌ์˜๊ณ„์‚ฐํ• ์ด๋ฏธ์ง€์ฑ„๋„iChannels[]={0}, ๊ด€์‹ฌ์˜์—ญํžˆ์Šคํ† ์ •๋ณดMobjHisto, โ˜…๊ฐํ”ฝ์…€์˜์ƒ‰ํ™•๋ฅ ๋‹ด์€์ƒ‰๊ณต๊ฐ„๋งตMbackProject, ํžˆ์Šคํ† ๊ทธ๋žจ๋ฒ”์œ„histoRange);
ใ„ดrotateRroi = CamShift(MbackProject, Rroi, TermCriteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1));
ใ„ดellipse(m_MimageColor, rotateRroi, Scalar(0, 0, 255), 2) ๋˜๋Š” rotateRroi.points(points)์œผ๋กœ line()๋ฐ˜๋ณต๋ฌธํ•ด์„œ ์ƒ์ž๊ทธ๋ฆฌ๊ธฐ
ํฌ๊ธฐํšŒ์ „์ถ”์  CamShift() vs ๋ฌด๊ฒŒ์ค‘์‹ฌ์ถ”์  meanShift(MbackProject, Rroi, TermCriteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1)); ๋˜‘๊ฐ™์€๋ฐ ๋ฐ”๋กœ rectangle() ๊ทธ๋ฆฌ๊ธฐ

[18์‘์šฉ์ฃผ์ œ]
๋„ํ˜•์ธ์‹
์†์ธ์‹
์ฑ…๊ฒ€์ถœ
์–ผ๊ตด์ถ”์ 
opencv๊ตฌ๋™inAOS

[๊ฒ€์‚ฌ์ฝค๋ณด]
cv::resize(matImageGray, matImageGray, cv::Size(), 0.1, 0.1, cv::INTER_LINEAR);
cv::equalizeHist(matImageGray, matImageGray);
cv::GaussianBlur(matImageGray, matImageGray, cv::Size(5, 5), 0);
cv::adaptiveThreshold(matImageGray, matImageGray, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 251, 2);
cv::morphologyEx(matImageGray, matImageGray, cv::MORPH_CLOSE, cv::Mat());

// useful
cv::threshold(cv::THRESH_TRUNC) // ์ตœ๋Œ€๊ฐ’์„์„ค์ •
cv::adaptiveThreshold(cv::ADAPTIVE_THRESH_MEAN_C) // ๋ธ”๋ก์‚ฌ์ด์ฆˆํ‰๊ท ์—์„œ c๋ฅผ ๋บธ๊ฐ’์œผ๋กœ
cv::boundingRect() / cv::minAreaRect
cv::drawContours() //๋‚ ๋ฆฌ๊ธฐ -> ๋‚ ๋ฆฐํ›„ drawContour
cv::bilateralFilter //์—ฃ์ง€๋Š”์‚ด๋ฆฌ๊ณ -๋…ธ์ด์ฆˆ๋Š”์ค„์ด๋Š”ใ…‹
area๋Š” ๋ฉด์ ์ด์Šˆ์žˆ์Œ, cv::countNonZero ์ถ”์ฒœ
imageMoment/hueMoment, cv::arcLength -> compactness, cv::contourArea