intel made
<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>
โ ์ค์น์ ์ค์ "
์๋์ฐ์ฉ์ผ๋ก ๋ค์ด์ ๋ฐ๋๋ค.
/ํค๋ ๊ฒฝ๋ก์ค์ /
ํ๋ก์ ํธ ์์ฑ - 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