OpenCV ကေလလာြခငး
Open Source Computer Vision
သငစကအတကအြမင
ကေအး
coolemerald.blogspot.com
Monday 27th March, 2017
ေကျးဇးတငလာ
OpenCV အေကာငး ေရးေတာ image processing န ပတသက ပး အကအညေတ
ေပးခ ကတ မတေဆေတက သတရမ၊ ေကျးဇးတငမပါတယ။ ၂၀၀၉ ေလာကက C န
image processing ေတလပေတာ စာအပေတပေပးခတ ေငမးေအာငက ေကျးဇးတငတ
အေကာငးေြပာချငပါတယ။ အဒ အချနတနးက algorithm ေတေတာေတာများများ
က ကယဟာကယပ implement လပရေတာ connected component labeling
တလ နညးေတန မတဆကေပး၊ အကဉာဏေကာငးေတ အ မေပးခတ ေဇာမငးဦးက
အရမး ေကျးဇးတငပါတယ။ ၂၀၁၀ ေလာကကOpenCV န မတဆကေပး၊ စာအပေတပါ
ေပးခတ ဉာဏပငစး ကလညး အထးေကျးဇးတငပါတယ။ OpenCV န ပတသက ပး
အားေပး၊ တကတနးခ ကတ ေနဦး၊ သကမနေထး တက လညး သတတရ ေကျးဇး
တငမ ပါတယ။ ေနာကဆးအေနန ကေတာက နေတာအေပ ချစခင၊သညးခ၊ ြဖညဆညး
ေပးတ ချစဇနး သရ က ေကျးဇးတငတ အေကာငး ေြပာပါရေစ။
i
မာတကာ
ေကျးဇးတငလာ i
မာတကာ ii
ပများ v
ဇယားများ vii
သေကတ၊အေခ အေဝ များ viii
၁ မတဆက ၁
၁.၁ ေနာကခအေကာငးအရာ . . . . . . . . . . . . . . . . . . . . . . . . ၁
၁.၂ ဖစညးပ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၂
၁.၃ OpenCV က Linux တင တပဆငြခငး . . . . . . . . . . . . . . . . ၃
၁.၃.၁ OpenCV က GCC ၊ CMake တ ြဖင အသးြပ ြခငး . . . . . . ၅
၁.၃.၂ OpenCV က Qt ြဖင အသးြပ ြခငး . . . . . . . . . . . . . . ၇
၁.၄ OpenCV က Windows တင တပဆငြခငး . . . . . . . . . . . . . . ၁၁
၁.၅ Source ကဒများ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၁၉
၂ တညရာနယတငြပ စပြခငးများ ၂၀
၂.၁ ေချာမတရနြပ ြပငြခငးများ . . . . . . . . . . . . . . . . . . . . . . . ၂၀
၂.၁.၁ boxFilter . . . . . . . . . . . . . . . . . . . . . . . . . . . ၂၀
ii
မာတကာ iii
၂.၁.၂ blur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၂၂
၂.၁.၃ GaussianBlur . . . . . . . . . . . . . . . . . . . . . . . . . ၂၂
၂.၁.၄ medianBlur . . . . . . . . . . . . . . . . . . . . . . . . . . ၂၃
၂.၂ filter2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၂၆
၂.၃ Thresholding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၂၉
၂.၄ ပလးေဖာလပေဆာငချကများ . . . . . . . . . . . . . . . . . . . . . ၃၅
၂.၄.၁ တကစားြခငး (erosion) . . . . . . . . . . . . . . . . . . . . ၃၅
၂.၄.၂ ေဖာငးပြခငး (dilation) . . . . . . . . . . . . . . . . . . . . ၃၆
၂.၄.၃ morphologyEx . . . . . . . . . . . . . . . . . . . . . . . . ၃၆
၂.၅ အေရာငနယေြပာငးလြခငးများ . . . . . . . . . . . . . . . . . . . . ၄၀
၂.၆ Source ကဒများ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၄၂
၃ ကမ နးနယတငြပ စပြခငးများ ၄၃၃.၁ ကမ နးနယပယ၏ Gaussian Filter များ . . . . . . . . . . . . . . . ၄၄
၃.၂ ကမ နးနယ၏ Butterworth Filter များ . . . . . . . . . . . . . . . ၄၅
၃.၃ Wiener Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . ၅၂
၃.၄ Source ကဒများ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၆၀
၄ ဗဒယြပ စပြခငး ၆၁၄.၁ ဗဒယ ဖတြခငး၊ေရးြခငး . . . . . . . . . . . . . . . . . . . . . . . . ၆၁
၄.၂ Real-time Face Detection . . . . . . . . . . . . . . . . . . . . . . ၆၄
၄.၃ Source ကဒများ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၆၈
၅ ပရပခြခမးသးသပ ာေဖြခငးများ ၇၀၅.၁ Connected Component Labeling . . . . . . . . . . . . . . . . . ၇၀
၅.၂ Template Matching . . . . . . . . . . . . . . . . . . . . . . . . . ၇၄
၅.၃ Harris Corner Detector . . . . . . . . . . . . . . . . . . . . . . . ၇၈
၅.၄ ြမနမာ ငင၏ဗဟ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၈၀
၅.၅ Source ကဒများ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၈၅
iv မာတကာ
A ေနာကဆကတ ငးလငးချက ၈၆၁.၁ ThresholdTypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၈၆
အကးအကားများ ၉၀
ပများ
၁.၁ DisplayImage ပ ဂရမ ၏ ရလာဒ က terminal င ယ တ ြပထား
သည။ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၇
၁.၂ Qt တင new project တစခက ဖနတးြခငး။ . . . . . . . . . . . . . ၉
၁.၃ ပ ဂရမမ ထကေပလာသည သရ၏ မရငးပ င အြဖ အမညး ပများ။ ၁၀
၁.၄ Environment variable အသစထပထညြခငး။ . . . . . . . . . . . . ၁၂
၁.၅ Visual Studio 2015 တင project အသစ တစခ ဖနတးြခငး။ . . . . ၁၂
၁.၆ Platform က x64 အားေရးြခငး။ . . . . . . . . . . . . . . . . . . . . ၁၃
၁.၇ Property Manager ကဖငြခငး။ . . . . . . . . . . . . . . . . . . . . ၁၃
၁.၈ Property Sheet ထညြခငး။ . . . . . . . . . . . . . . . . . . . . . . ၁၄
၁.၉ Include directory အားသတမတြခငး။ . . . . . . . . . . . . . . . . ၁၅
၁.၁၀ Library directory အား သတမတြခငး။ . . . . . . . . . . . . . . . . ၁၅
၁.၁၁ Library အမညအား သတမတြခငး။ . . . . . . . . . . . . . . . . . . ၁၆
၁.၁၂ Deprecation က disable လပြခငး။ . . . . . . . . . . . . . . . . . ၁၇
၁.၁၃ Mask လပ၍ရသည ရလဒ။ . . . . . . . . . . . . . . . . . . . . . . ၁၉
၂.၁ Smoothing filter များက ငးယ ေဖာြပြခငး။ . . . . . . . . . . . . ၂၅
၂.၂ filter2D ၏ရလဒများက ငးယ ေဖာြပြခငး။ . . . . . . . . . . . . . ၂၈
၂.၃ Thresholding ရလဒများက ငးယ ေဖာြပြခငး။ . . . . . . . . . . . ၃၄
v
vi ပများ
၂.၄ ပလးေဖာလပေဆာငချကများ၏ရလဒများက ငးယ ေဖာြပြခငး။ Open-
ing တင အြဖ ေရာင အစကများ ေပျာကသား သည။ Closing တင
အမညး ေရာင အစကများ ေပျာကသား သည။ . . . . . . . . . . . . ၃၉
၂.၅ မရငးပ၊ mask င အေရာငေြပာငး ပးသည ပများ။ . . . . . . . . . . ၄၂
၃.၁ ကမ နးနယ တင filtering လပြခငး။ . . . . . . . . . . . . . . . . . ၄၄
၃.၂ GLPF၏ ပမာဏအားအလငး ြပငးအား၊ အနမ အြမင တ ြဖင ေဖာြပ
ထားပ။ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ၄၅
၃.၃ နမနာအေန င channel တစခထက ကမ နးနယတငဖယတာြခငး။ . ၅၂
၃.၄ Noiseထ၍ဝါးေနေသာပကWiener filter ြဖင deblurလပ ပးသည
အခါ ရလာေသာ ရလဒ။ . . . . . . . . . . . . . . . . . . . . . . . . ၆၀
၄.၁ တချန င တေြပးည မျက ာ ာေဖြခငး။ . . . . . . . . . . . . . . . . ၆၈
၅.၁ ဆကစပေနေသာ နယေြမ များအားအစကတနဖးတစခြခငးအေန င
ေတ င ပး၊ သတ၏ label များ၊ အေရအတက၊အကးဆး နယေြမ၏
အကျယအဝနး၊ ဗဟတက ေဖာြပထားသည။ . . . . . . . . . . . . . ၇၃
၅.၂ Template matching လပ၍ရေသာ ပ။ . . . . . . . . . . . . . . . . ၇၇
၅.၃ ေထာင အသငအြပင များက ာေဖြခငး။ . . . . . . . . . . . . . . . ၇၉
၅.၄ ြမနမာ ငင ေြမပအား Googlemaps မရယလကေသာမရငး င၊ GIMP
ကသး၍ အစနး များ င အတ crop လပ၊ အြဖ အမညး ေြပာငးထားပ။ ၈၁
၅.၅ ြမနမာြပည ေြမပ၏ အလယဗဟ။ . . . . . . . . . . . . . . . . . . . ၈၄
ဇယားများ
၁.၁ Threshold အမျ းအစားများ၏ ညမ ြခငးများ။ . . . . . . . . . . . . . ၈၇
vii
သေကတ၊အေခ အေဝ များ
OpenCV . . . . . . . . . . . . . . . . . . Open source computer vision
vs14 . . . . . . . . . . . . . . . . . . . . . . Visual studio 2015
x86 . . . . . . . . . . . . . . . . . . . . . . . A family of backward compatible 32 bit instruction set
architectures based on the Intel 80386 CPU
x64 . . . . . . . . . . . . . . . . . . . . . . . The 64-bit version of the x86 instruction set
DFT . . . . . . . . . . . . . . . . . . . . . Discrete Fourier Transform
ကမ နးနယ . . . . . . . . . . . . . . . Frequency domain
တညရာနယ . . . . . . . . . . . . . . . . Spatial domain
ပရပြပ စပြခငး . . . . . . . . . . . . . Image processing
ပလးေဖာလပေဆာငချကများ Morphological operation
ြပကက . . . . . . . . . . . . . . . . . . . . Frame
ြပ နး . . . . . . . . . . . . . . . . . . . . . Frame rate
viii
သေကတ၊အေခအေဝ များ ix
ဖယတာ . . . . . . . . . . . . . . . . . . . Filter
အေရာငနယ . . . . . . . . . . . . . . . Color space
ြဖညစကအာ ရပ . . . . . . . . . . . Augmented reality
အခနး ၁
မတဆက
OpenCVသညပညာေရးအတကသာမက၊ စးပားေရးအတကပါအလကားသးစခင ေသာ
free software တစခြဖစ ပး၊ BSD license ငထတသည [1]။ C/C++ ၊ Python ၊
Java များ ငတဖကအသးြပ င ပး၊ Windows ၊ Linux ၊MacOS များအေပတငသာမက
iOS ၊ Androidအစ ေသာmobile platformများအတကပါအလပလပသည။OpenCV
ကထေရာကြမနဆနစာတကချကမ ငအချန ငအမအေရးကးေသာ real-timeအသးချမ
များအတကအဓကထားကာဒဇငးထဆစြပလပထားသည။ C/C++သး၍ေရးထားသြဖင
multi-core processing များ၏ေကာငးကကကလညးအသးချ ငသည။OpenCVကအ
ပညာလပငနးများမအစ၊ မငး ာြခငး၊ ေြမပများချတဆကြခငး၊အဆငြမငစက ပများဖန
တးြခငးအထနယပယအမျ းမျ းတငကျယကျယြပန ြပနအသးြပ ေနကသည။
၁.၁ ေနာကခအေ ကာငးအရာ
OpenCV၏အဓပါယ မာOpen Source Computer Vision Library ြဖစ၍ မရငးကဒ
များအား ဖငြပထားသည။ကနပျ တာ င စကအြမငဆငရာလပငနး များတငကးကား
အသးြပ စရာ ေဆာဖဝ library ြဖစသည။OpenCVက စတင ဖနတးစ မစ၍ကနပျ တာ
င စကအြမငဆငရာ အများ သငါ အလယအကအသးြပ ငသည ဘယ ရားတစခ
ရရန ရညရယသည။ စးပားေရးထတကန များတငပါ စကအြမငဆငရာအပငး များတင
၁
၂ အခနး ၁. မတဆက
တးတကမ ေစရန ြဖစသည။ BSD-license ငေပးထား သညအတက စးပားေရး
လပငနး များတင အလယတကယသး၊ ြပ ြပ င နငသည။
ဤ library တင အေကာငးဆး ရေစရန ချနည ထားေသာ နညးလမး (algorithm)
ေပါငး ၂၅၀၀ ေကျာ သည။ နညးေဟာငးများ မစ၍ ေနာကဆးေပ နညးလမးသစ
များအထ ြပညစ စပစာ ပါဝငသည။ ထနညးလမး များက မျက ာ များက ာေဖ
သ ြခငး၊ မတမြခငး (face detection and recognition)၊ အရာဝတ များက ခြခား
သ ြခငး (object identification)၊ ဗဒယ အတငးမ လ အမအရာ များက ခြခား သတ
မတြခငး (classification of human actions)၊ ေရလ ား ေနေသာ အရာဝတ များ
ေနာကလကြခငး (tracking moving objects)၊ သးဘကြမင ေမာဒယ ထတြခငး (3D
modeling)၊ ပပ များက ဆကြခငး (stiching)၊ သမးထားသည ပများ ထမ တေသာ
ပက ေရးထတြခငး၊ ခငး များက မတမြခငး၊ ြဖညစကအာ ရပ (augmented real-
ity) များအတက အမတ အသား များ လပြခငး တတင အသးြပ ငသည။
၁.၂ ဖစညးပ
OpenCVကအပငး (module) များ ခ၍တညေဆာကထားသည။ထေ ကာင များစာေသာ
sharedသမဟတ static libraries များ ပါဝင ေနသည။အဓကအသး များေသာအပငး
များမာ ေအာကပါ အတငး ြဖစသည [2]။
core အေြခခ အချကအလက ပစများ၊ multi-dimensional array Mat င အြခား
အပငးများ အတကပါ လအပေသာ အေြခခ လပေဆာငချက များ (core func-
tionalities) ပါဝငသည ကျစလစသည အေြခခ ကျေသာ အပငး ြဖစသည။
imgproc ပပ များက ပထက ြပ ြပငေသာ ဖယတာ (filter) များ၊ ပ အရယ အစား၊
အြမင ေြပာငးြခငး များ၊ အေရာင ေြပာငးြခငး များ၊ histogramအစ သညတ
ပါဝငေသာ ပရပြပ စပြခငး (image processing) အပငး ြဖစသည။
video ဗဒယ များက ခြခမးသးသပ၍ေရလျားမက ခနမနး ြခငးများ၊ ေနာကခ ြမငကငး
က ဖယေဖျာက ြခငးများ၊အရာ ဝတ များေနာက ေြခရာခ ြခငး များတ ပါဝငသည
၁.၃. OPENCV က LINUX တင တပဆငြခငး ၃
အပငး ြဖစသည။
calib3d ကငမရာ ချနညြခငး (camera calibration)၊ object pose ခနမနး ြခငး၊
stereo correspondence algorithms၊ သးဘက ြမငကငး ြပန တညေဆာက
ြခငး (3D reconstruction) တ ပါဝင သည။
features2d ပများ အဓကအသငအြပင (salient feature) များက ာြခငး င de-
scriptor matcher များ ပါဝငသည။
objdetect သတမတ ထားေသာ အရာ ဝတ များက ာြခငး (ဥပမာ မျက ာ (face
detection)၊ မျကလး၊ မတခက၊ လ၊ ကား၊ စသည များ)။
highgui း ငးသည UI (user interface) လပေဆာငမ များအတက အလယတက
သး ငေသာ interface ြဖစသည။
Video I/O ဗဒယ များ ဖမးယ ြခငး၊ င video codecs များ ပါဝင သည။
gpu OpenCV module များ အတက GPU accelerated algorithm များ ပါဝင
သည။
အြခားအပငး များလညး ေသးသည။လက OpenCVကတညေဆာကထားပမာ
fully re-enterable ြဖစ သြဖင function တစခ က မတည ေသာ thread များမ
ပ ငတ သး င သည။
၁.၃ OpenCV က Linux တင တပဆငြခငး
ေအာကပါအဆင များက Ubuntu 16.04 LTSတငOpenCV-3.2.0အားသး၍စမး ကည
ထားသည [3]။ အြခား ဗား ငး များ အတကလညး အဆငေြပ ငသည။
ပထမအဆငအေန င ေအာကပါ packages များ စကထတင ရနလအပသည။
1. GCC 4.4.x or later
၄ အခနး ၁. မတဆက
2. CMake 2.6 or higher
3. Git
4. GTK+2.x or higher, including headers (libgtk2.0-dev)
5. pkg-config
6. Python 2.6 or later and Numpy 1.5 or later with developer packages
(python-dev, python-numpy)
7. ffmpeg or libav development packages: libavcodec-dev, libavformat-
dev, libswscale-dev
8. (optional) libtbb2 libtbb-dev
9. (optional) libdc1394 2.x
10. (optional) libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-
22-dev
ထ packages များအား စကထသ ထညသငး လပါက Synaptic Manager သး၍
ေသာ လညးေကာငး၊ terminalinal တင ေအာက စာရငး ၁.၁ ပါ command များ
က ပ၍ ေသာ လညးေကာငး ထည င သည။
1 sudo apt−get i n s t a l l bui ld−e s s e n t i a l
2 sudo apt−get i n s t a l l cmake g i t l i bg t k2 .0−dev pkg−conf ig
l ibavcodec−dev l ibav format−dev l i b swsca l e−dev
3 sudo apt−get i n s t a l l python−dev python−numpy l ib tbb2 l ib tbb−dev
l ib jpeg−dev l ibpng−dev l i b t i f f −dev l i b j a s pe r−dev l ibdc1394
−22−dev
စာရငး ၁.၁: OpenCV အတက လအပေသာ packages များ ရယြခငး။
၁.၃. OPENCV က LINUX တင တပဆငြခငး ၅
လက ေနာကဆးထက OpenCVအေြခကျ ဗာ ငးက OpenCV for Linux/Mac
(http://opencv.org/downloads.html)တငယ ငသည။ Homeတင opencvဆသည
folder ဖ၍သမးလကမည။ထ zip ဖငအား ArchiveManagerသး၍ extractလပ ငသည။
ဤေနရာတင သးလကသည ဗား ငးအတက ရလာသည folder မာ opencv-3.2.0
ြဖစသြဖင ထ ေနရာသ သား၍ release ဆသည folder တစခ ဖနတးကာ ဖငများ
ထတ၍ သမးဆညးရန ေအာကပါ စာရငး ၁.၂ command များ ကမည။
1 cd ~/opencv / opencv−3.2 .0
2 mkdir r e l ea se
3 cd r e l ea se
4 cmake −D CMAKE_BUILD_TYPE=RELEASE −D CMAKE_INSTALL_PREFIX=/usr /
l o c a l . .
စာရငး ၁.၂: OpenCV က build လပြခငး။
ေခတ ေစာငဆငး ပးသည အခါ ေအာကပါ စာရငး ၁.၃ အတငး install လပမည။
1 make
2 sudo make i n s t a l l
စာရငး ၁.၃: OpenCV က install လပြခငး။
၁.၃.၁ OpenCV က GCC ၊ CMake တ ြဖင အသးြပ ြခငး
OpenCVကသးရနအလယဆး နညးမာ CMake ြဖင သးြခငး ြဖစသည [4]။ CMake
င မရငး း ပါကCMake tutorial (https://cmake.org/cmake-tutorial/)တငသား
ေရာက ေလလာ ငသည။
ပထမ ေြခလမး အေန င ပတစပက ဖတ၍ ြပသည း ငးသည နမနာ ေလးအား
စမးသပ ကညမည။ ထ အတက thiri.jpg ဆသည ဓာတပက home folder တင
ထားလက မည။ထေနာက ေအာကပါ DisplayImage.cpp (စာရငး ၁.၄)ဆသည ပ ဂရမ
၆ အခနး ၁. မတဆက
ေလးအား ဖနတး လကမည။ ပးသည အခါ DisplayImage ဟသည folder တစခ
ဖ၍ ထထ တင သမးဆညး လကမည။
1 #include <stdio.h>
2 #include <opencv2/opencv.hpp>
3 using namespace cv;
4 int main(int argc, char** argv )
5 {
6 Mat image;
7 image = imread( "/home/yan/thiri.jpg", 1 );
8 if ( !image.data ) {
9 printf("No image data \n");
10 return -1;
11 }
12 namedWindow("Display Image", WINDOW_AUTOSIZE );
13 imshow("Display Image", image);
14 waitKey(0);
15 return 0;
16 }
စာရငး ၁.၄: ပ တစပ က ဖတ၍ ြပသည DisplayImage ပ ဂရမ။
ဤေနရာ တင thiri.jpg အတက path မာ ”/home/yan/thiri.jpg” ြဖစ ပး သငပ
သည folder ၊ username တ င ကကညသည path က အစားထး ရမည။ imread
သည လမးေကာငး ေပးလကသည ပဖငက ဖတသည။ ဒတယ argument ြဖစသည
1 မာ ကာလာပ ဖတမည ဟဆလြခငး ြဖစသည။ 0 ဆပါကအြဖ အမညး ေြပာငး၍
ဖတမည။ ပက ဖတ၍ မရ ပါက message ကြပ၍ ထကသားမည ြဖစ ပး၊ ဖတ၍
ေအာငြမင ပါက imshowကသး၍ ပကထတြပမည ြဖစသည။တဖန CMakeLists.txt
ဆသည ဖငက ေအာကပါ စာရငး ၁.၅ အတငး ဖနတးမည။
1 cmake_minimum_required ( VERSION 2 . 8 )
2 pro j e c t ( DisplayImage )
3 f ind_package ( OpenCV REQUIRED )
၁.၃. OPENCV က LINUX တင တပဆငြခငး ၇
4 add_executable ( DisplayImage DisplayImage . cpp )
5 t a r g e t _ l i n k _ l i b r a r i e s ( DisplayImage $ { OpenCV_LIBS } )
စာရငး ၁.၅: CMakeLists.txt
ဤတင လချငသည ပ ဂရမ က ေအာကပါ စာရငး ၁.၆ command များအား
terminal တင ကြခငးြဖင ထတလပ ရ င၊ run ကည င သည။
1 cd DisplayImage
2 cmake .
3 make
4 . / DisplayImage
စာရငး ၁.၆: DisplayImage က build ၍ run ြခငး။
Run လကသည အခါ ေအာကပါ ပ ၁.၁ အတငး ရ မည။
ပ ၁.၁: DisplayImage ပ ဂရမ ၏ ရလာဒ က terminal င ယ တ ြပထား သည။
၁.၃.၂ OpenCV က Qt ြဖင အသးြပ ြခငး
အသး များေသာ IDE တစခ ြဖစသည Qt င OpenCV က အသး ြပ ြခငး အေကာငး
ေဆးေ း မည။ ေအာကပါ အဆင များက Ubuntu 16.04 LTS x64 တင Qt 5.8.0
၈ အခနး ၁. မတဆက
င OpenCV-3.2.0 အား သး၍ စမး ကည ထားသည။ Qt က ရယ၍ တပဆငရန
ေအာကပါ စာရငး ၁.၇ command များက terminal တင က ငသည။
1 wget http : / / download . qt . io / o f f i c i a l _ r e l e a s e s / qt / 5 . 7 / 5 . 7 . 0 / qt−
opensource−l i nux−x64 −5 . 7 . 0 . run
2 chmod +x qt−opensource−l i nux−x64 −5 . 7 . 0 . run
3 . / qt−opensource−l i nux−x64 −5 . 7 . 0 . run
စာရငး ၁.၇: Qt က Linux တင တပဆင ြခငး။
ထေနာက အြခား လအပေသာ g++ ၊ font configuration ၊ OpenGL များ ရယ
ရန ေအာကပါ စာရငး ၁.၈ အတငး လပေဆာင ငသည။
1 sudo apt−get i n s t a l l bui ld−e s s e n t i a l
2 sudo apt−get i n s t a l l l i b f on t con f i g1
3 sudo apt−get i n s t a l l mesa−common−dev
4 sudo apt−get i n s t a l l l i bg lu1−mesa−dev −y
စာရငး ၁.၈: Qt အတက အြခား လအပေသာ packages များရယ ြခငး။
တပဆင ပးပါက း ငးေသာOpenCV နမနာတစခက စမးသပရနQtက ဖငမည။
New Project က ပ၍ Non-Qt Project င Plain C++ Application က choose
မည (ပ ၁.၂)။
Project Location အတက DisplayImageQt စသြဖင အမညေပး၊ folder ဖ၍
ေရးချယ မည။ Build Systemတင qmakeအတငးထားမည။ Kit Selectionတငလညး
Desktop Qt 5.8.0 GCC 64bit အတငး ထား င သည။ Next ထပ ပ ၍ Project
Managementတင Noneအတငး ထားမည။ထေနာက Project ေအာကမ Sources
main.cpp တင ေအာကပါ စာရငး ၁.၉ ပ ဂရမ အတငး ေရးမည။
1 #include <stdio.h>
2 #include <opencv2/opencv.hpp>
3 using namespace cv;
4 int main(int argc, char** argv )
၁.၃. OPENCV က LINUX တင တပဆငြခငး ၉
ပ ၁.၂: Qt တင new project တစခက ဖနတးြခငး။
5 {
6 Mat image,bw_img;
7 image = imread( "/home/yan/thiri.jpg", 1 );
8 if ( !image.data ) {
9 printf("No image data \n");
10 return -1;
11 }
12 namedWindow("Original Image", WINDOW_AUTOSIZE );
13 imshow("Original Image", image);
14 cvtColor(image, bw_img, COLOR_BGR2GRAY);
15 namedWindow("BW Image", WINDOW_AUTOSIZE );
16 imshow("BW Image", bw_img);
17 waitKey(0);
18 return 0;
19 }
စာရငး ၁.၉: ပ တစပက ဖတြပ၍ အြဖ အမညး ေြပာငးေပးေသာ ပ ဂရမ။
၁၀ အခနး ၁. မတဆက
ဤ ပ ဂရမ တင ပက ဖတ၍ ရသည အခါ cvtColor က သး၍ အြဖ အမညး ပ
ြဖစေအာင ေြပာငးသည။တဖနDisplayImageQt.proဟသည ဖငက ဖင၍ ေအာကပါ
စာရငး ၁.၁၀ အတငး ြဖစေအာင ထပြဖည မည။
1 TEMPLATE = app
2 CONFIG += console c++11
3 CONFIG −= app_bundle
4 CONFIG −= qt
5 SOURCES += main . cpp
6 INCLUDEPATH += / usr / l o c a l / inc lude / opencv
7 L IBS += −L / usr / l o c a l / l i b −lopencv_core −lopencv_highgui −
lopencv_imgproc −lopencv_imgcodecs
စာရငး ၁.၁၀: DisplayImageQt.pro
ပးေနာက ပ ဂရမ အား run ကညပါက ပ ၁.၃ အတငး သရ၏ မရငး င အြဖ
အမညး ပများ လပစာ ေပထက လာမည။
ပ ၁.၃: ပ ဂရမမ ထကေပလာသည သရ၏ မရငးပ င အြဖ အမညး ပများ။
၁.၄. OPENCV က WINDOWS တင တပဆငြခငး ၁၁
၁.၄ OpenCV က Windows တင တပဆငြခငး
Windows အတကမ pre-built လပ ပး ြဖစေသာ လက ေနာကဆးထက OpenCV
အေြခကျ ဗာ ငးကသးမည။ ၄ငးအား OpenCV forWindows (https://sourceforge
.net/projects/opencvlibrary/files/opencv-win/) တင ယ ငသည။ ရ လာေသာ
opencv-3.2.0-vc14.exeအားဤနမနာအတက C:\opencv ေအာကတင opencv320
အေန င extract လပသည။
IDE အတက Visual Studio 2015 က Visual Studio 2015 (https://www.
visualstudio.com/downloads/) မ ရယ၍ installလပမည။ ေအာကပါအဆင များက
Windows 10 64 bit တင Visual Studio 2015 င OpenCV-3.2.0 အား သး၍
စမးကည ထားသည။ အြခား ဗား ငးများ အတကလညး ဆငတ ယးမား နညးလမး
များသာ ြဖစသည [5]။
64 bit windows င Visual Studio 2015အတက enviroment variableတစခ
အေန င OPENCV_DIRကသတမတ မည။ထအတက Commandwindowက ad-
ministrator အေန င run ရန start menuက right click ပ၍ command prompt
(admin) က ေရး ပး လျင ေအာကပါ စာရငး ၁.၁၁ အတငး ကထည ငသည။
1 setx −m OPENCV_DIR C : \ opencv \ opencv320 \ bu i ld \ x64 \ vc14
စာရငး ၁.၁၁: OPENCV_DIR က သတမတ ြခငး။
DLL များ သးသည အခါ bin folder သည ေနရာက system path တင ထညရန
အတက Rapid Environment Editorအစ သည utilityတကသး၍ေသာလညးေကာငး၊
This PC(My Computer) > Properties > Advanced System Settings > Ad-
vanced Tab > Environment variables > Edit System Variables တင Path
က ပ ၁.၄ တင ြပထား သကသ edit လပ ပး ေသာလညးေကာငး တနညးနညး သး၍
%OPENCV_DIR%\bin က system path အေန င ထည ငသည။
ထသ install လပြခငးများ ပးစး ပါက OpenCV က အသးြပ ၍ နမနာ တစခ
စမးသပကည မည။ Visual Studio 2015 က ဖင၍ ပ ၁.၅ ကသ project အသစ
၁၂ အခနး ၁. မတဆက
ပ ၁.၄: Environment variable အသစထပထညြခငး။
တစခ ဖနတး မည။ Installed > Visual C++>General > Empty Projectကေရးမည။
ပ ၁.၅: Visual Studio 2015 တင project အသစ တစခ ဖနတးြခငး။
ထေနာကညာဖက Solution Explorerအတငး Source Filesကညာဖကကလစ
ပကာ Add >New Item... မတဆင ေပလာေသာ pop-up windowတင Installed
၁.၄. OPENCV က WINDOWS တင တပဆငြခငး ၁၃
> Visual C++ > C++ File (.cpp) က ေရးကာ main.cpp အမည င ဖင အလတ
တခက ထညမည။ အေပ Tool bar Solution Platforms တင ပ ၁.၆ ကသ x86
အစား x64 သ ေြပာငးလက မည။
ပ ၁.၆: Platform က x64 အားေရးြခငး။
OpenCV င application များ ေရးရနလအပသညအလပ စခ သည။OpenCV
library များမာ မညသည ပစ ြဖစသညက compilerအား ေြပာရန င OpenCV func-
tion များ၊ data structure များအား မညသည ေနရာတင ယရ မညက linker အား
ေြပာရန ြဖစသည။ထအတက ပ ၁.၇တင ြပထားသကသ အေပ menu bar View
> Other Windows > Property Manager ကသား၍ ဖငမည။
ပ ၁.၇: Property Manager ကဖငြခငး။
၁၄ အခနး ၁. မတဆက
ပးေနာကညာဖက PropertyManagerတငလက လပမည configuration ြဖစေသာ
Debug|x64တငညာဖကကလစ ပ၍ AddNewProject Property Sheet... ကေရးကာ
’OpenCV320’အမည property sheetတစခ ဖနတးမည (ပ ၁.၈)။ Property sheet
က တစကမ ဖနတး ပးပါက ေနာက Project များတင Add New အစား Add Exist-
ing Property Sheet က ေရးကာ ြပနလည အသးြပ ငသည။
ပ ၁.၈: Property Sheet ထညြခငး။
ထေနာက Property Manager အတငး OpenCV320 အမည ေပတင ညာဖက
ကလစ ပကာ Propertiesက ေရးမည။ ေပလာသည Property Pagesတင C/C++
> General > Additional Include Directories ၌
$(OPENCV_DIR)\..\..\include
ဟြဖည ပး Apply က ပမည (ပ ၁.၉)။
တဖန Linker ေအာက General > Additional Library Directories ၌ ပ ၁.၁၀
ကသ
$(OPENCV_DIR)\lib
၁.၄. OPENCV က WINDOWS တင တပဆငြခငး ၁၅
ပ ၁.၉: Include directory အားသတမတြခငး။
ဟ န ပးသည အြပင မညသည library ဟ သတမတရန Linker ေအာက Input
> Additional Dependencies တင သးမည library modules များ၏ အမညက
ြဖညရမည။
ပ ၁.၁၀: Library directory အား သတမတြခငး။
ဤနမနာတငသးသည OpenCV 3.2.0အတက C:/opencv/opencv320/build/
x64/vc14/libတင opencv_world320.lib င opencv_world320d.libဟ၍ library
module စခ ေတ ငသည။ Debug mode အတက d င အဆးသတ သည mod-
ule သး င ပး၊ Release mode အတက ကျနတစခ က သးရမည။ Module နာမည
နပါတ 320 မာ opencv version 3.2.0အတက ြဖစ ပး၊သးသည version ေပ မတည၍
ေြပာငးမည။
ယခ နမနာ အတက ေအာကပါ library အမည
၁၆ အခနး ၁. မတဆက
opencv_world320d.lib
က ထညမည (ပ ၁.၁၁)။
ပ ၁.၁၁: Library အမညအား သတမတြခငး။
OpenCVတငသးသည fopenသည Visual Studio 2015 ၌ deprecation ြဖစသား
သညက disable လပရန C/C++ > Preprocessor > Preprocessor Definitions
တင
_CRT_SECURE_NO_DEPRECATE
ဟ ြဖညမည (ပ ၁.၁၂)။
OpenCV စမး ကညရန နမနာက ေအာကပါ စာရငး ၁.၁၂ အတငး ေရး ငသည။
1 #include <stdio.h>
2 #include <opencv2/opencv.hpp>
3 using namespace cv;
4 int main(int argc, char** argv)
5 {
6 Mat image;
၁.၄. OPENCV က WINDOWS တင တပဆငြခငး ၁၇
ပ ၁.၁၂: Deprecation က disable လပြခငး။
7 image = imread("C:/opencv/thiri.jpg",0);
8 if (!image.data) {
9 printf("No image data \n");
10 return -1;
11 }
12 namedWindow("Display Image", WINDOW_AUTOSIZE);
13 imshow("Display Image", image);
14
15 //Create a circular mask
16 int h = image.rows;
17 int w = image.cols;
18 Mat mask(h, w, CV_8UC1, Scalar(0, 0, 0));
19 circle(mask, Point(w / 2, h / 2), h / 3, 255, -1);
20
21 //Perform bitwise 'AND' to mask out
22 Mat im2;
23 bitwise_and(image, mask, im2);
24
၁၈ အခနး ၁. မတဆက
25 //Manipulate pixels
26 for (int i=0; i < h; i++)
27 for (int j=0; j < w; j++)
28 if (mask.at<uchar >(i, j) == 0)
29 im2.at<uchar >(i, j) = 128;
30 namedWindow("Masked Image", WINDOW_AUTOSIZE);
31 imshow("Masked Image", im2);
32
33 waitKey(0);
34 return 0;
35 }
စာရငး ၁.၁၂: main.cpp
ဤေနရာ တင thiri ၏ ပက C:/opencv/thiri.jpg တင ထားထား ပး၊ သ သည
ေနရာ full pathက ေရးဖ လသည။ Forward slashကလကခသြဖင“/”ကသးြခငးက
ငးလငးသည။ Backslash က သးလ ပါက escape character အေန င “\\” သးရန
သတြပ ပါ။
ဤ ပ ဂရမတင လမးေကာငး ေပးထားသည ပက ဖတသည အခါ ဒတယ ar-
gument မာ 0 ြဖစသြဖင အြဖ အမညး အေန င ဖတသည။ ထေနာက Mat က
သး ပး maskဆသည ပ အလတတခကအမညးေရာင (တနဖး 0အြပည) ြဖင ဖနတး
လကသည။
ပးသည အခါ circle က သး၍ အြဖ ေရာင စကဝငး တခ mask ၏ အလယ တင
ဆလကသည။ bitwise_andကသးလကသညအခါmaskတင 0 သည pixelအားလး
0 (အမညးေရာင) ြဖစသား၍၊ mask တင အြဖ ေရာင သည ေနရာများ (အလယ
စကဝငး) တငသာ မရငးပ ကျနခမည။
ပးလင for loopကသး၍mask၏အမညးေရာင pixelတစခြခငးစ၏တနဖးက
မးခးေရာင (128) ြဖစေအာင ေြပာငးလကသည။ ရလာသည ပက imshow ငြပသည။
ရလဒက ေအာကပါ ပ ၁.၁၃ တင ြမင ငသည။
၁.၅. SOURCE ကဒများ ၁၉
ပ ၁.၁၃: Mask လပ၍ရသည ရလဒ။
၁.၅ Source ကဒများ
ဤအခနး ပ ဂရမများ၏ source ကဒများက ေအာကပါ ေနရာတင ေတ ငသည။
• OpenCV Simple Project Templates onGitHub - https://github.com/yan9a/
OpenCV_Projects
အခနး ၂
တညရာနယတငြပ စပြခငးများ
ဤ အပငးတင 2D ပရပများ၌ အမျ းမျ းေသာ linear င non-linear ဖယတာ (fil-
ter) များအား အသးြပ ပ က ေဖာြပပါမည [6]။ ပရပတခ၌ ေသာ အစက (pixel)
တခြခငးစတငသ ေနရာအနးအနား ေသာအြခားအစကများ၏တနဖးများ င ေပါငးစပ
ေြပာငးလြခငးများ ြပလပြခငး ြဖစသြဖင တညရာနယ ဖယတာ လပြခငး (spatial
filtering) ဟေြပာ ငသည။
၂.၁ ေချာမတရနြပ ြပငြခငးများ
၂.၁.၁ boxFilter
boxFilter သည ပရပ pixel ဟေခသည အစက တခချငးအား အနး အစကတနဖး
များ င ေပါငးစပ ေရာေ ာ ပး ပရပအား ဝါးေစသည။ သ၏ ပစမာ ေအာကပါ အတငး
ြဖစသည။
void boxFilter(InputArray src, OutputArray dst, int ddepth,
Size ksize,Point anchor=Point(-1,-1), bool normalize=true,
int borderType=BORDER_DEFAULT )
ထ parameters များမာ
၂၀
၂.၁. ေချာမတရနြပ ြပငြခငးများ ၂၁
src: သည input image ဟေခ ေသာ မရငး input အေန င ေပးရမည ပြဖစသည။
dst: သည output အေန င ထကလာမည image ြဖစ ပး src င အရယအစား ၊
အမျ းအစား တမည။
ddepth: သညထကလာမည output image၏ depth ြဖစသည။ ( -1 ဆပါက src
၏ depth င တမည။)
ksize: သည blurring kernel size ြဖစသည။
anchor: သည anchor point ဟေခ ေသာ kernel ၏ အေြခ ေနရာြဖစသည။ De-
fault တနဖးြဖစေသာ Point(-1,-1) ဆပါက အလယတညတည တင မည။
normalize: သည kernelကသ၏area င ြပနစား ပး normalizeလပမလပသတမတသည။
borderType: သည bordermodeဟေခ ေသာ ပအနားသတ အစကများတနဖးက
တကသည အခါ မညသည extrapolate နညးသးမည ကသတမတသည။
ဤ boxFilter function ၏ smooth လပေသာ kernel မာ ေအာကပါ အတငး
ြဖစသည။
K = α
1 1 . . . 1
1 1 . . . 1... ... . . . ...
1 1 . . . 1
(၂.၁)
ဤတင
α =
1
ksize.width×ksize.height, when narmalize=true
1, otherwise(၂.၂)
ြဖစသည။
၂၂ အခနး ၂. တညရာနယတငြပ စပြခငးများ
၂.၁.၂ blur
Blurသည normalized box filterကသး၍ ပက ဝါးေစသည။ boxFilterက ddepth
တင src၏depthအတငးထား ပး၊ normalizeတင true ေပးသည ငထပတညသည။
Blur filter ၏ ပစမာ ေအာကပါ အတငး ြဖစသည။
void blur(InputArray src, OutputArray dst, Size ksize,
Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT )
၂.၁.၃ GaussianBlur
GaussianBlurသည Gaussian filterကသး၍ ပက ဝါးေစသည။ညကေညာစာ ဝါးေစသြဖင
ကမးေနေသာ ပများအား ေချာမတေစြခငး၊ noise များအား ေလျာပါးေစြခငး တတင
အသးများသည။ ဤ function ၏ ပစမာ
void GaussianBlur(InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY=0,
int borderType=BORDER_DEFAULT )
ြဖစသည။ Parameters များမာ ေအာကပါအတငးြဖစသည။
src: သည input image ဟေခ ေသာ မရငး input အေန င ေပးရမည ပြဖစသည။
ထပတင channel အေရအတက ကကသေလာက င ပး သးသနစ process
လပမည ြဖစသည။သေသာ depthအေန င CV_8U, CV_16U, CV_16S, CV_32F,
CV_64F များမ တစမျ းမျ းသာ သး၍ရမည။
dst: သည output အေန င ထကလာမည image ြဖစ ပး src င အရယအစား ၊
အမျ းအစား တမည။
ksize: သည Gaussian kernel size ြဖစသည။ ksize.width င ksize.height တ
မတ၍ ရေသာလညး မ ဂဏနးတနဖးများသာ ြဖစရမည။သမဟတပါကသည
ြဖစနင ပး၊ ထတနဖးများအား sigma မတကယ လမမည။
၂.၁. ေချာမတရနြပ ြပငြခငးများ ၂၃
sigmaX: သည Gaussian kernel ၏ X ဝင း တေလာက standard deviation
ြဖစသည။
sigmaY: သည Gaussian kernel ၏ Y ဝင း တေလာက standard deviation
ြဖစသည။သည ြဖစပါက sigmaXအတငးယမည။ စခလးသည ြဖစေနပါက
ksize.width င ksize.height မတကယ လမမည။
borderType: သည bordermodeဟေခ ေသာ ပအနားသတ အစကများတနဖးက
တကသည အခါ မညသည extrapolate နညးသးမည ကသတမတသည။
၂.၁.၄ medianBlur
Median filter က သး ပး ပက ဝါးေစလပါက medianBlur အား သး ငသည။ Gaus-
sian filter င ယ လင ပ၏ ြပတသားမက ထခကမ ပနညးသည။ Salt and Pepper
noise များအား ဖယ ားရာတင အသးတညသည။ ဤ filter ၏ပစမာ
void medianBlur(InputArray src, OutputArray dst, int ksize)
ြဖစသည။ Parameters များမာ ေအာကပါ အတငးြဖစသည။
src: သည input image ဟေခ ေသာ မရငး input အေန င ေပးရမည ပြဖစသည။
ထပတင channel အေရအတက ၁ ခ၊ ၃ ခ၊ သမဟတ ၄ ခ ငသည။ ksize ၃
သမဟတ ၅ ဆပါက depth တင CV_8U, CV_16U, CV_32F တမ တစမျ းမျ း
သာ သး၍ ရမည။ ပကးေသာ ksize များအတက CV_8U တမျ းသာ ရမည။
dst: သည output အေန င ထကလာမည image ြဖစ ပး src င အရယအစား ၊
အမျ းအစား တမည။
ksize: သည aperture linear size ြဖစ ပး ၁ထကကးေသာမဂဏနးတနဖး များသာ
ြဖစရမည။ ဥပမာ ၃, ၅, ၇, ...
ေဖာြပခေသာ smoothing filter များအား ေအာကပါ စာရငး ၂.၁တင ြပထားေသာ
ပ ဂရမက သး၍ စမး ကည ငသည။
၂၄ အခနး ၂. တညရာနယတငြပ စပြခငးများ
1 #include <stdio.h>
2 #include <opencv2/opencv.hpp>
3 using namespace cv;
4 int main()
5 {
6 //Read original image
7 Mat image;
8 image = imread("C:/opencv/star.jpg",0);
9 if (!image.data) {
10 printf("No image data \n");
11 return -1;
12 }
13 namedWindow("Original Image", WINDOW_AUTOSIZE);
14 imshow("Original Image", image);
15
16 //Box filter
17 Mat im_box;
18 boxFilter(image, im_box, -1, Size(7, 7), Point(-1, -1), true,
BORDER_DEFAULT);
19 namedWindow("Box filter", WINDOW_AUTOSIZE);
20 imshow("Box filter", im_box);
21
22 //Gaussian filter
23 Mat im_gaussian;
24 GaussianBlur(image, im_gaussian , Size(7, 7), 0, 0);
25 namedWindow("Gaussian filter", WINDOW_AUTOSIZE);
26 imshow("Gaussian filter", im_gaussian);
27
28 //Median filter
29 Mat im_median;
30 medianBlur(image, im_median , 7);
31 namedWindow("Median filter", WINDOW_AUTOSIZE);
၂.၁. ေချာမတရနြပ ြပငြခငးများ ၂၅
32 imshow("Median filter", im_median);
33 waitKey(0);
34 return 0;
35 }
စာရငး ၂.၁: Smoothing filter များ အတက နမနာ ပ ဂရမ။
ပ ဂရမ၏ ရလဒများအား ေအာကပါ ပ ၂.၁ တင ငးယ ေဖာြပထားသည။
(a) မရငးပ။ (b) box filter ၏ ရလဒ။
(c) Gaussian filter ၏ ရလဒ။ (d) median filter ၏ ရလဒ။
ပ ၂.၁: Smoothing filter များက ငးယ ေဖာြပြခငး။
၂၆ အခနး ၂. တညရာနယတငြပ စပြခငးများ
၂.၂ filter2D
ပတစခက kernel တစခ င convolve လပေပးသည [7]။ မမစတ ကက custom
kernel အသးြပ ၍ ရသညမာ အားသာချကြဖစသည။ ဤ filter ၍ပစမာ
void filter2D(InputArray src, OutputArray dst,
int ddepth, InputArray kernel,
Point anchor=Point(-1,-1), double delta=0,
int borderType=BORDER_DEFAULT )
ြဖစသည။ ထတင သးရမည parameters များမာ ေအာကပါအတငး ြဖစသည။
src: သည input image ဟေခ ေသာ မရငး input အေန င ေပးရမည ပြဖစသည။
dst: သည output အေန င ထကလာမည image ြဖစ ပး src င အရယအစား ၊
အမျ းအစား တမည။
ddepth: သညထကလာမည output image၏ depth ြဖစသည။ ( -1 ဆပါက src
၏ depth င တမည။) ေအာကတင ြပထားေသာ အတများ ရသည။
• src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
• src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
• src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
• src.depth() = CV_64F, ddepth = -1/CV_64F
kernel: သည convolution kernel ြဖစသည။ single-channel floating pointma-
trix ြဖစသည။ မတေသာ channel များအား မတေသာ kernel သးချငပါက
ပက split() သး ပး သတသတစ ခသးရမည ြဖစသည။
anchor: သည anchor point ဟေခ ေသာ kernel ၏ အေြခ ေနရာြဖစသည။ De-
fault တနဖးြဖစေသာ Point(-1,-1) ဆပါက အလယတညတည တင မည။
၂.၂. FILTER2D ၂၇
delta: filter လပ၍ရသည pixel တနဖးတင ေပါငးထည ေပးမည optional value
ြဖစသည။
borderType: သည bordermodeဟေခ ေသာ ပအနားသတ အစကများတနဖးက
တကသည အခါ မညသည extrapolate နညးသးမည ကသတမတသည။
အမနတင ဤ function တကေပးသညမာ convolution မဟတပ correlation
သာ ြဖစသည။
dst(x, y) =
(kernel.cols−1)∑i=0
(kernel.rows−1)∑j=0
kernel(i, j)∗
src(x+ i− anchor.x, y + j − anchor.y) (၂.၃)
Convolutionအစစ သးလပါက kernel က flip() ဆသည လပေဆာငချက အရင
သးေပး ငသည။ filter2Dအတက နမနာ ပ ဂရမက ေအာကပါ စာရငး ၂.၂တင ေဖာြပ
ထားသည။
1 #include <stdio.h>
2 #include <opencv2/opencv.hpp>
3 using namespace cv;
4 int main()
5 {
6 //Read original image
7 Mat image;
8 image = imread("C:/opencv/grove.jpg",1);
9 //image = imread("/home/yan/grove.jpg",1);
10 if (!image.data) {
11 printf("No image data \n");
12 return -1;
13 }
14 namedWindow("Original Image", WINDOW_AUTOSIZE);
15 imshow("Original Image", image);
16
၂၈ အခနး ၂. တညရာနယတငြပ စပြခငးများ
17 //create kernel
18 Mat kernel;
19 int kernel_size = 9;
20 kernel = Mat::ones(kernel_size , kernel_size , CV_32F) / (float)(
kernel_size*kernel_size);
21
22 //filter2D filter
23 Mat im_filter;
24 filter2D(image, im_filter , -1, kernel, Point(-1, -1), 0,
BORDER_DEFAULT);
25 namedWindow("filter2D", WINDOW_AUTOSIZE);
26 imshow("filter2D", im_filter);
27 waitKey(0);
28 return 0;
29 }
စာရငး ၂.၂: filter2D အတက နမနာ ပ ဂရမ။
ပ ဂရမ၏ ရလဒအား ေအာကပါ ပ ၂.၂ တငမရငး င ငးယ ေဖာြပထားသည။
(a) မရငးပ။ (b) filter2D ၏ ရလဒ။
ပ ၂.၂: filter2D ၏ရလဒများက ငးယ ေဖာြပြခငး။
၂.၃. THRESHOLDING ၂၉
၂.၃ Thresholding
Thresholdingသညအေြခခအကျဆး၊အ း ငးဆး segmentationလပေဆာငေသာ
နညးြဖစသည။ ပတစပ အတက ပငးချမည thresholdတစခ သတမတကာထထက
ပများ၊ ပေတာကပပါကအြဖ ၊ နညးပါကအမညး စသညြဖင ပငးချလကြခငးြဖစသည။
ထအတကအသးြပ ငေသာ threshold function၏ ပစက ေအာကတင ေဖာြပထားသည
[8]။
double cv::threshold (InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
)
Parameters များမာ ေအာကပါအတငးြဖစသည။
src: သည input array ြဖစ ပး single-channel သ 8-bit သ 32-bit floating point
တစခခ ြဖစ ငသည။
dst: သည output array ြဖစ ပး src င အရယတ၊ အမျ းအစားတ ြဖစသည။
thresh: သည threshold တနဖး ြဖစသည။
maxval: သညmaximumတနဖး ြဖစသည။သတမတချက ေြပလညပါကထား မည
pixel ၏တနဖး ြဖစသည။
type: သည threshold ပငးချမည လပေဆာငမ အမျ းအစား ြဖစ ပး ေအာကပါတမ
တစခခ ြဖစ ငသည (ေနာကဆကတ ၁.၁ ကကညပါ)။
• THRESH_BINARY
• THRESH_BINARY_INV
၃၀ အခနး ၂. တညရာနယတငြပ စပြခငးများ
• THRESH_TRUNC
• THRESH_TOZERO
• THRESH_TOZERO_INV
• THRESH_MASK
• THRESH_OTSU
• THRESH_TRIANGLE
Thresholdလပမည ပတင ကမ နးနမ (low frequency)အလငးေရာငအေြပာငး
အလများ ပါ ပါကအထကပါ global thresholding နညး မသးခင ကမ နးနမ အပငး
များအား ဖယထတရန လမည။ သမဟတပါက ေအာကတင ေဖာြပထားသည adap-
tive thresholding ကသး င သည [9]။
void cv::adaptiveThreshold ( InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C
)
Parameters များမာ ေအာကပါအတငးြဖစသည [10]။
src: သည 8-bit single-channel image ြဖစ ငသည။
dst: သည destination image ြဖစ ပး src င အရယတ၊ အမျ းအစားတ ြဖစသည။
maxval: သည သတမတချကေြပလညပါက ထား မည pixel ၏တနဖး ြဖစသည။
adaptiveMethod: သညသးမည Adaptive thresholding algorithm ြဖစ ပး ေအာက
ပါတမ တစခခ ြဖစ ငသည။
၂.၃. THRESHOLDING ၃၁
• ADAPTIVE_THRESH_MEAN_C
• ADAPTIVE_THRESH_GAUSSIAN_C
thresholdType: သည threshold ပငးချမညလပေဆာငမအမျ းအစား ြဖစ ပး ေအာက
ပါတမ တစခခ ြဖစ ငသည။
• THRESH_BINARY
• THRESH_BINARY_INV
blockSize: သည pixel တစခ၏ threshold က ာသညအခါ သးမည အနးအနား
ဝနးကျင အရယအစား ြဖစ ပး 3, 5, 7, စသည တနဖး တစခခ ြဖစသည။
C: သညmeanသ weightedmean မ တေပးမညကနးေသ ြဖစသည။ ပမနအားြဖင
အေပါငးကနးြဖစေသာလညး သညသ အ တ ကနးများလညး ြဖစ ငသည။
Thresholding ြပလပသည နမနာ ဂ ဂရမ တစခ က ေအာကပါ စာရငး ၂.၃ တင
ေတ ငသည။
1 #include "opencv2/imgproc.hpp"
2 #include "opencv2/imgcodecs.hpp"
3 #include "opencv2/highgui.hpp"
4 using namespace cv;
5
6 Mat src, src_gray , dst;
7 int threshold_value = 128;
8 int threshold_type = 0;
9 int const max_BINARY_value = 255;
10 void Threshold_changed(int, void*);
11 const char* window_name = "Thresholding";
12
13 int main()
14 {
15 //src = imread("/home/yan/ka.jpg", IMREAD_COLOR);
၃၂ အခနး ၂. တညရာနယတငြပ စပြခငးများ
16 src = imread("c:/opencv/ka.jpg", IMREAD_COLOR);
17 if (src.empty()) { return -1;}
18
19 namedWindow("Original", WINDOW_AUTOSIZE);
20 imshow("Original",src);
21
22 cvtColor(src, src_gray , COLOR_BGR2GRAY); // Convert the image to
Gray
23 namedWindow(window_name ,WINDOW_NORMAL); // Create a window to
display results
24
25 // Create Trackbar to choose type of Threshold
26 //Type: 0= Binary , 1= Binary Inverted ,
27 // 2= Truncate , 3= To Zero, 4= To Zero Inverted ,
28 // 5= Adaptive threshold using ADAPTIVE_THRESH_GAUSSIAN_C
29 int const max_type = 5;
30 createTrackbar("Type",
31 window_name , //window for trackbar
32 &threshold_type , // value to be updated according to trackbar
33 max_type , //range
34 Threshold_changed);//function to be called everytime trackbar is
changed
35
36 // Create Trackbar to choose Threshold value
37 int const max_value = 255;
38 createTrackbar("Value",
39 window_name , &threshold_value ,
40 max_value , Threshold_changed);
41
42 Threshold_changed(0, 0); // Call the function to initialize
43
44 //loop until 'Esc' key is pressed
45 for (;;) {
၂.၃. THRESHOLDING ၃၃
46 char c = (char)waitKey(20);
47 if (c == 27) { break;}
48 }
49
50 //save the resulting binary image
51 imwrite("c:/opencv/ka_binary.jpg",dst);
52 return 0;
53 }
54 void Threshold_changed(int, void*)
55 {
56 if (threshold_type == 5) {
57 adaptiveThreshold(src_gray , dst, max_BINARY_value ,
58 ADAPTIVE_THRESH_GAUSSIAN_C , THRESH_BINARY , 11, 2);
59 }
60 else {
61 threshold(src_gray , dst, threshold_value ,
62 max_BINARY_value , threshold_type);
63 }
64 imshow(window_name , dst);
65 }
စာရငး ၂.၃: Thresholding နမနာ ပ ဂရမ။
ပ ဂရမ၏ ရလဒအား ေအာကပါ ပ ၂.၃ တငမရငး င ငးယ ေဖာြပထားသည။
၃၄ အခနး ၂. တညရာနယတငြပ စပြခငးများ
(a) မရငးပ။
(b) Binary threshold-
ing ၏ ရလဒ။
(c) Inverse binary ၏
ရလဒ။
(d) THRESH_TRUNC
၏ ရလဒ။
(e) THRESH_TO-
ZERO ၏ ရလဒ။
(f) THRESH_TO-
ZERO_INV ၏ ရလဒ။
(g) adaptive Thresh-
old ၏ ရလဒ။
ပ ၂.၃: Thresholding ရလဒများက ငးယ ေဖာြပြခငး။
၂.၄. ပလးေဖာလပေဆာငချကများ ၃၅
၂.၄ ပလးေဖာလပေဆာငချကများ
အေြခခတညေဆာကပစ (structuring element)တစခ၏သ ာန (shape)ကအေြခခ
၍ ပက ြပ ြပငြခငးအား ပလးေဖာလပေဆာငချကများ (morphological operation)
ဟေခ မည။ Noise အစကအေြပာကများအား ဖယ ာြခငး၊ ထဆကေနေသာ အပငး
များအား ခြခားြခငး၊ အစ ေသာ ေနရာများတင အသးြပ ကသည [6]။
Structuring elementက getStructuringElement()ကအသးြပ ၍ရယ ငသည။
Mat cv::getStructuringElement (int shape,
Size ksize, Point anchor = Point(-1,-1) )
Parameters များမာ ေအာကပါအတငးြဖစသည။
shape: သည MORPH_RECT, MORPH_CROSS, MORPH_ELLIPSE တမ တစခခ
ြဖစ ငသည။
ksize: သည structuring element ၏ အရယြဖစသည။
anchor: သည anchor pointဟေခ ေသာ element၏အေြခ ေနရာြဖစသည။ De-
fault တနဖးြဖစေသာ Point(-1,-1) ဆပါက အလယတညတည တင မည။
၂.၄.၁ တကစားြခငး (erosion)
ပသ ာနတစခ ၏ အြဖ ေရာင အပငးက ကျ သား၊ ပါးသားေအာင စားေပးသည။
void erode(InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() )
၃၆ အခနး ၂. တညရာနယတငြပ စပြခငးများ
၂.၄.၂ ေဖာငးပြခငး (dilation)
ပသ ာနတစခ ၏ အြဖ ေရာင အပငးက ပလာ၊ ြပနကားလာ ေအာင ကးေစသည။
void dilate(InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() )
၂.၄.၃ morphologyEx
အြခားပ၍ ပေထးေသာ morphological operation များအား သးလပါက mor-
phologyEx က သး ငသည။
void morphologyEx(InputArray src, OutputArray dst, int op,
InputArray kernel, Point anchor=Point(-1,-1),
int iterations=1, int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() )
ထတင op မာ morphological operation အမျ းအစား ြဖစ ပး ေအာကပါတမ
တစခ ြဖစ ငသည။
• MORPH_OPEN - an opening operation
• MORPH_CLOSE - a closing operation
• MORPH_GRADIENT - a morphological gradient
• MORPH_TOPHAT - “top hat”
• MORPH_BLACKHAT - “black hat”
• MORPH_HITMISS - “hit and miss”
၂.၄. ပလးေဖာလပေဆာငချကများ ၃၇
နမနာ ပ ဂရမ တစခက ေအာကပါ စာရငး ၂.၄ တင ေဖာြပ ထားသည။
1 #include <stdio.h>
2 #include <opencv2/opencv.hpp>
3 using namespace cv;
4 int main()
5 {
6 //Read original image
7 Mat image;
8 image = imread("C:/opencv/ka_ori.jpg", 0);
9 //image = imread("/home/yan/ka_ori.jpg", 0);
10 if (!image.data) {
11 printf("No image data \n");
12 return -1;
13 }
14 namedWindow("Original Image", WINDOW_AUTOSIZE);
15 imshow("Original Image", image);
16
17 Mat e_struc = getStructuringElement(MORPH_RECT , Size(7, 7),
Point(3, 3));
18
19 //erosion
20 Mat im_e;
21 erode(image, im_e, e_struc);
22 namedWindow("Erosion", WINDOW_AUTOSIZE);
23 imshow("Erosion", im_e);
24
25 //dilation
26 Mat im_d;
27 dilate(image, im_d, e_struc);
28 namedWindow("Dilation", WINDOW_AUTOSIZE);
29 imshow("Dilation", im_d);
30
31 //opening
၃၈ အခနး ၂. တညရာနယတငြပ စပြခငးများ
32 Mat im_o;
33 morphologyEx(image, im_o, MORPH_OPEN , e_struc);
34 namedWindow("Opening", WINDOW_AUTOSIZE);
35 imshow("Opening", im_o);
36
37 //closing
38 Mat im_c;
39 morphologyEx(image, im_c, MORPH_CLOSE , e_struc);
40 namedWindow("Closing", WINDOW_AUTOSIZE);
41 imshow("Closing", im_c);
42
43 //opening and closing to remove noise
44 Mat im_r;
45 morphologyEx(image, im_o, MORPH_OPEN , e_struc);
46 morphologyEx(im_o, im_r, MORPH_CLOSE , e_struc);
47 namedWindow("Remove noise", WINDOW_AUTOSIZE);
48 imshow("Remove noise", im_r);
49
50 //gradient
51 Mat g_struc = getStructuringElement(MORPH_RECT , Size(3, 3),
Point(1, 1));
52 Mat im_g;
53 morphologyEx(image, im_g, MORPH_GRADIENT , g_struc);
54 namedWindow("Gradient", WINDOW_AUTOSIZE);
55 imshow("Gradient", im_g);
56
57 waitKey(0);
58 return 0;
59 }
စာရငး ၂.၄: ပသ ာနဆငရာေြပာငးလြခငးများ အတက နမနာ ပ ဂရမ။
၂.၄. ပလးေဖာလပေဆာငချကများ ၃၉
ပ ဂရမ၏ ရလဒအား ေအာကပါ ပ ၂.၄ တငမရငး င ငးယ ေဖာြပထားသည။
(a) မရငးပ။
(b) Erosion (c) Dilation (d) Opening
(e) Closing (f) Removing noise (g) Gradient
ပ ၂.၄: ပလးေဖာလပေဆာငချကများ၏ ရလဒများက ငးယ ေဖာြပြခငး။ Open-
ing တင အြဖ ေရာင အစကများ ေပျာကသား သည။ Closing တင အမညး ေရာင
အစကများ ေပျာကသား သည။
၄၀ အခနး ၂. တညရာနယတငြပ စပြခငးများ
၂.၅ အေရာငနယေြပာငးလြခငးများ
အေရာငနယ (Color space) ေြပာငးြခငး င ပတသက၍RGBမHSVသေြပာငးသးသည
နမနာတစခက ေဆးေ းပါမည [11, 12]။ HSVသညအေရာငကအေြခခေသာ ြပ ြပငြခငး၊
ာေဖြခငး၊ မတမြခငး များအတကများစာအဆငေြပအသးဝငသည။ ပတစပ အြပာ
ေရာငအပငးများက ေရးချယ၍အစမးေရာင ေြပာငးေပးသည နမနာ ဂ ဂရမက ေအာကပါ
စာရငး ၂.၅ တငေတ ငသည။
1 //File: color.cpp
2 //Description: Selective Color Modification
3 //WebSite: http://cool-emerald.blogspot.com
4 //MIT License (https://opensource.org/licenses/MIT)
5 //Copyright (c) 2017 Yan Naing Aye
6
7 #include <stdio.h>
8 #include <opencv2/opencv.hpp>
9 using namespace cv;
10 int main(int argc, char** argv)
11 {
12 Mat image;
13 image = imread("C:/opencv/lane.jpg", 1);
14 if (!image.data) {
15 printf("No image data \n");
16 return -1;
17 }
18 namedWindow("Original Image", WINDOW_AUTOSIZE);
19 imshow("Original Image", image);
20
21 //Convert to hsv
22 Mat hsv;
23 cvtColor(image, hsv, COLOR_BGR2HSV);
24
၂.၅. အေရာငနယေြပာငးလြခငးများ ၄၁
25 //select pixels
26 //the range of H channel is 0-179.
27 //blue at 240 deg corresponds to 120 in H channel
28 Mat bw;
29 inRange(hsv, Scalar(80, 0, 0), Scalar(140, 255, 255), bw);
30 namedWindow("Mask", WINDOW_AUTOSIZE);
31 imshow("Mask", bw);
32
33 //Manipulate pixels
34 for (int i = 0; i < image.rows; i++)
35 for (int j = 0; j < image.cols; j++)
36 if (bw.at<uchar >(i, j) > 128)
37 hsv.at<Vec3b>(i, j)[0] = (hsv.at<Vec3b >(i, j)[0] + 120) % 180;
38
39 //Convert to bgr
40 Mat im2;
41 cvtColor(hsv, im2, COLOR_HSV2BGR);
42
43 namedWindow("Modified Image", WINDOW_AUTOSIZE);
44 imshow("Modified Image", im2);
45
46 waitKey(0);
47 return 0;
48 }
49
စာရငး ၂.၅: အေရာငေရးချယေြပာငးလြခငး။
ဤပ ဂရမတင cvtColor ကသး၍ RGB မ HSV သေြပာငးသည။ Opencv တင
Blue channelသညအရငြဖစသည။ HSV spaceတငအြပာေရာငမာ 240◦ တင ရာ
Opencv၏hue channel၏ range 0 - 180 ငအချ းချ ပါက120 ဝနးကျငြဖစသည။
ထေ ကာင inRange က သး၍ 80 - 140 အတငး အေရာငများက mask အေန င
၄၂ အခနး ၂. တညရာနယတငြပ စပြခငးများ
ထတလကသည။အြပာကအစမးေရာင ေြပာငးရန 240◦လညရနလအပသညအတက
pixel တစခချငးစအား 120 ေပါငးကာ အများဆး h တနဖး 180 ေကျာပါက color
space၏အစဘကမ ြပနစ ေပးရနလသည။ထပအား RGB color spaceသ ြပနေြပာငး
သည အခါ ရလာေသာ ရလဒများက ေအာကပါ ပ ၂.၅ တင ြမင ငသည။
ပ ၂.၅: မရငးပ၊ mask င အေရာငေြပာငး ပးသည ပများ။
၂.၆ Source ကဒများ
ဤအခနး ပ ဂရမများ၏ sourceကဒများက ေအာကပါ ေနရာများတင ေတ ငသည။
• Spatial Filtering onGitHub - https://github.com/yan9a/ OpenCV_Spatial
_Filtering
• Selective Color Modification on GitHub - https://github.com/yan9a/
Selective_Color_Modification
အခနး ၃
ကမ နးနယတငြပ စပြခငးများ
ဤအပငးတင 2D ပရပများက ကမ နးနယ (frequency domain) တင ေဖာြပြခငး၊
ြပ စပြခငးများအေကာငး ေဆးေ းမည [13]။ ကမ နး (Frequency)ကအေြခခေသာ
ခြခမး စတြဖာ ြခငးများ၊ ြပ ြပငြခငး များသည ပရပများအား ပမ ေကာငးမန ေစြခငး၊
ပရပများအား ြပနလည တညေဆာက ြခငးများ အတက အဓက ေသာချကြဖစသည။
တညရာနယ (spatial domain) မ ကမ နးနယ သ ေြပာငးလရန Discrete Fourier
Transform (DFT)ကသး ငသည။အရယအစားM×N ေသာ ပရပတစခအတက
2 dimessional DFT င သ၏ ေြပာငးြပန (inverse) DFT တက ေအာကပါ ညမ ြခငး
များ င ေဖာြပ ငသည [14]။
F (u, v) =M−1∑x=0
N−1∑y=0
f(x, y)e−j2π(uxM
+ vyN
) (၃.၁)
f(u, v) =1
MN
M−1∑u=0
N−1∑v=0
F (x, y)ej2π(xuM
+ yvN
) (၃.၂)
ကမ နးနယ တင filtering လပသည အခါသးသည အေြခခ အဆင များအား
ေအာကပါ ပ ၃.၁ တင ေဖာြပ ထားသည။
H(u, v) ြဖငကယစားြပ ေဖာြပသည Filter များအား ကမ နးနယတငတက က
ြပလပ င ပး၊ သတ၏ အလယမတ အား origin အေန င သတမတပါက၊ origin မ
၄၃
၄၄ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
preprocessing
f(x,y)
Input image
DFT
F(u,v)filterH(u,v) H(u,v)F(u,v)
inverseDFT
postprocessing
g(x,y)
Filtered image
ပ ၃.၁: ကမ နးနယ တင filtering လပြခငး။
pixel တစခအထ အကာအေဝး D(u,v) အား ေအာကပါအတငး ာ ငသည။
D(u, v) =√u2 + v2 (၃.၃)
၃.၁ ကမ နးနယပယ၏ Gaussian Filter များ
Gaussian low pass filter (GLPF) ၏ cutoff frequency အား standard deviation
ငတနဖးတ σ ဟသတမတပါက၊ H(u, v) အား ေအာကပါအတငး ေဖာြပ ငသည။
H(u, v) = e−u2+v2
2σ2 (၃.၄)
ေအာကပါပ ၃.၂ တင အလယမတအနး ကမ နးနမသည အပငးတင ြပငးအားများ၍၊
ကမ နးြမငသညအပငးတင ြပငးအားေလျာသားသညက ြမင ငသည။
ထနညးတGaussian high pass filter (GHPF)ဆပါကေအာကပါအတငး ေဖာြပ
ငသည။
H(u, v) = 1− e−u2+v2
2σ2 (၃.၅)
၃.၂. ကမ နးနယ၏ BUTTERWORTH FILTER များ ၄၅
(a) အလငးအေမာင။ (b) အနမအြမင။
ပ ၃.၂: GLPF ၏ ပမာဏအား အလငး ြပငးအား၊ အနမ အြမင တ ြဖင ေဖာြပ ထားပ။
၃.၂ ကမ နးနယ၏ Butterworth Filter များ
Butterworth filter များ၏ ရလဒများမာ ေချာေမသြဖင သတအား maximally flat
magnitude filter များ ဟလညး ေခ ကသည။ H(u, v)၏ cutoff frequency အား
origin မ အကာအေဝး D0 ဟ သတမတပါက၊ order n ေသာ Butterworth low
pass filter (BLPF) အား ေအာကပါအတငး ေဖာြပ ငသည။
H(u, v) =1
1 +[u2+v2
D20
]n (၃.၆)
ထနညးတ Butterworth high pass filter (BHPF) ဆပါက ေအာကပါ အတငး ေဖာြပ
ငသည။
H(u, v) =1
1 +[
D20
u2+v2
]n (၃.၇)
ကမ နးနယပယတင ပတစပက ြပ ြပင ပး၊ noise ထညေပးသည နမနာတစခက
ေအာကပါ freqfilter.cpp (စာရငး ၃.၁) တင ေတ ငသည။
1 //File: freqfilter.cpp
2 //Description: filtering in frequency domain
3 //WebSite: http://cool-emerald.blogspot.com
၄၆ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
4 //MIT License (https://opensource.org/licenses/MIT)
5 //Copyright (c) 2017 Yan Naing Aye
6
7 #include <stdio.h>
8 #include <iostream>
9 #include <opencv2/opencv.hpp>
10 using namespace std;
11 using namespace cv;
12
13 //Create an image of complex number type (2 channels to store
14 // real part and imaginary part) from an input grayscale image
15 // with an optimal size for DFT
16 // src : single channel grayscale image input
17 // dst : two channel complex image output
18 void i2z(Mat src, Mat& dst)
19 {
20 //get optimal size for dft
21 int m = getOptimalDFTSize(src.rows);
22 int n = getOptimalDFTSize(src.cols);
23
24 //change the image to optimal size, padding 0 values at bottom
and right
25 Mat im_padded;
26 copyMakeBorder(src, im_padded , 0, m - src.rows, 0, n - src.cols,
BORDER_CONSTANT , Scalar::all(0));
27
28 //convert the image to float type, create another one filled
with zeros ,
29 //and make an array of these 2 images
30 Mat im_array[] = { Mat_<float >(im_padded), Mat::zeros(im_padded.
size(), CV_32F) };
31
32 //combine as a 2 channel image to represent a complex number
၃.၂. ကမ နးနယ၏ BUTTERWORTH FILTER များ ၄၇
type image
33 Mat im_complex; merge(im_array , 2, im_complex);
34
35 im_complex.copyTo(dst);//copy to destination
36 }
37
38 // convert a 2 channel complex image to a single channel
grayscale image
39 // by getting magnitude , change scale , and normalize
40 // src : two channel complex image input
41 // dst : single channel grayscale image output
42 // LogScale : change to log scale or not
43 void z2i(Mat src, Mat& dst, bool LogScale = false)
44 {
45 Mat im_tmp[2]; split(src, im_tmp);//split the complex image to 2
46 Mat im_f; magnitude(im_tmp[0], im_tmp[1], im_f);//get absolute
value
47 if (LogScale) {
48 im_f += Scalar::all(1);//make minimum 1
49 log(im_f, im_f);//log scale
50 }
51 Mat im;
52 normalize(im_f, im, 0, 255, NORM_MINMAX ,CV_8U); //normalize
53 //im = Mat_<uchar >(im_f);
54 im.copyTo(dst);//copy to destination
55 }
56
57 // rearrange the quadrants of a Fourier image
58 void fftshift(Mat src) {
59 // make number of rows or columns even
60 src = src(Rect(0, 0, src.cols & -2, src.rows & -2));
61 int cx = src.cols / 2;
62 int cy = src.rows / 2;
၄၈ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
63 Mat q1(src, Rect(cx, 0, cx, cy));// Top-Right
64 Mat q2(src, Rect(0, 0, cx, cy));// Top-Left
65 Mat q3(src, Rect(0, cy, cx, cy));// Bottom -Left
66 Mat q4(src, Rect(cx, cy, cx, cy));// Bottom -Right
67 Mat tmp;
68 q2.copyTo(tmp);
69 q4.copyTo(q2);
70 tmp.copyTo(q4);
71 q1.copyTo(tmp);
72 q3.copyTo(q1);
73 tmp.copyTo(q3);
74 }
75
76 //Produce Gaussian filter in frequency domain
77 // height : height of the filter
78 // width : width of the filter
79 // std : standard deviation where intensity is 60% (like
cutoff frequency )
80 // highpass: true=highpass , false=lowpass
81 Mat GaussianFilter(int height, int width, float std, bool
highpass = false)
82 {
83 Mat im_filter = Mat::ones(Size(width, height), CV_32F);
84 float u, v, t;
85 int k = 0;
86 for (long i = 0; i < height; i++)
87 for (long j = 0; j < width; j++) {
88 u = i - height / 2;
89 v = j - width / 2;
90 t = exp(-(u*u + v*v)/(2.0*std*std));
91 if (highpass) t = 1 - t;//if high pass
92 im_filter.at<float >(i, j) = t;
93 }
၃.၂. ကမ နးနယ၏ BUTTERWORTH FILTER များ ၄၉
94 return im_filter;
95 }
96
97 //Produce Butterworth filter in frequency domain
98 // height : height of the filter
99 // width : width of the filter
100 // cutoffFreq:cutoff frequency where intensity is 50%
101 // order : order n
102 // highpass: true=highpass , false=lowpass
103 Mat ButterworthFilter(int height, int width, float cutoffFreq ,
int order, bool highpass = false)
104 {
105 Mat im_filter = Mat::ones(Size(width, height), CV_32F);
106 float u, v, t;
107 int k = 0;
108 for (long i = 0; i < height; i++)
109 for (long j = 0; j < width; j++) {
110 u = i - height / 2;
111 v = j - width / 2;
112 t = (u*u + v*v) / (cutoffFreq*cutoffFreq);
113 if (highpass) t = 1 / t;//if high pass
114 for (long k = 1; k < order; k++) t *= t;//for order n
115 t = 1 / (1 + t);
116 im_filter.at<float>(i, j) = t;
117 }
118 return im_filter;
119 }
120
121 //Add Gaussian noise
122 // src : single channel grayscale image input
123 // dst : single channel grayscale image output
124 // mean: mean
125 // std: standard deviation
၅၀ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
126 void GaussianNoise(Mat src, Mat& dst,float mean, float std)
127 {
128 Mat noise = Mat(src.size(),CV_32F);
129 randn(noise, 0, 0.05);
130 Mat im;
131 normalize(src, im, 0.0, 1.0, NORM_MINMAX , CV_32F);
132 im += noise;
133 normalize(im, im, 0, 255, NORM_MINMAX ,CV_8U); //normalize
134 im.copyTo(dst);//copy to destination
135 }
136
137 int main(int argc, char** argv)
138 {
139 //Get an image
140 Mat image = imread("C:/opencv/lake.jpg", IMREAD_GRAYSCALE);
141 if (!image.data) {
142 printf("No image data \n");
143 return -1;
144 }
145 namedWindow("Original Image", WINDOW_AUTOSIZE);
146 imshow("Original Image", image);
147
148 Mat im_complex; i2z(image, im_complex);//convert to complex type
149 dft(im_complex , im_complex);//perform discrete fourier transform
150
151 //display Fourier spectrum
152 Mat im_f; z2i(im_complex , im_f, true);//convert to grayscale
153 fftshift(im_f);//shift quadrants to make the center origin
154 namedWindow("Freq domain Image", WINDOW_AUTOSIZE);
155 imshow("Freq domain Image", im_f);
156
157 //Get a filter (freq domain)
158 //Mat im_filter = ButterworthFilter(im_complex.rows, im_complex.
၃.၂. ကမ နးနယ၏ BUTTERWORTH FILTER များ ၅၁
cols, 50,2,true);
159 Mat im_filter = GaussianFilter(im_complex.rows, im_complex.cols,
50, false);
160 namedWindow("Filter", WINDOW_AUTOSIZE);
161 imshow("Filter", im_filter);
162
163 fftshift(im_filter);//shift quadrants for matching
164 //multiply in freq domain (convolve in spatial domain)
165 Mat im_array[2]; split(im_complex , im_array);
166 im_array[0] = im_array[0].mul(im_filter);
167 im_array[1] = im_array[1].mul(im_filter);
168 merge(im_array , 2, im_complex);//combine these 2 into a complex
image
169
170 dft(im_complex , im_complex , DFT_INVERSE);//perform inverse
discrete fourier transform
171 Mat im_hp; z2i(im_complex , im_hp);//get grayscale
172 GaussianNoise(im_hp, im_hp, 0, 0.05);//add noise
173 namedWindow("Filtered Image", WINDOW_AUTOSIZE);
174 imshow("Filtered Image", im_hp);
175
176 //save the result
177 imwrite("C:/opencv/blur.jpg", im_hp);
178 waitKey(0);
179 return 0;
180 }
စာရငး ၃.၁: ကမ နးနယတင ဖယတာြခငး။
ပ ဂရမ i2zဆသည ဖန ငမာ grayscale ပရပတစခက DFT ြပလပရနအတက
complex numberအမျ းအစား ေြပာငးေပးသည။ z2i မာ complex imageက grayscale
ြပနေြပာငးေပး သည ဖန င ြဖစသည။ တက၍ ရေသာ fourier image တင သည
၅၂ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
ကမ နးမာ ဘယဖကအေပ ြဖစသြဖင origin အမတက အလယသ ေရရန fftshift
ဖန ငက သး ငသည။ ပ ဂရမ၏ ရလဒက ေအာကပါပ ၃.၃ တငေတ ငသည။
(a) အြဖ အမညး မေြပာငးခငမရငးပ။ (b) ဝါး၍ noise ေပါငးထညြခငး။
ပ ၃.၃: နမနာအေန င channel တစခထက ကမ နးနယတငဖယတာြခငး။
၃.၃ Wiener Filtering
ပများ ဝါးသားသညဆသညမာ နးကပ ေနေသာအစကများအချငးချငး ေပါငးစပ ေရာ
ေ ာ သားသညဟ ဆ ငသည။ ဖးကပ မြပတ၍ ဓာတပ ဝါးသား သညမာ အပါချာ
အဝနး သ ာန အနးအနား အစကများ ေရာသားြခငး ဟ ြမင ငသည။ ေရလျား၍
ဝါးသား (motion blur) သညမာ ေရလျားသည ဦးတညရာ တေလာက (များေသာ
အားြဖင ေဘးတက) အစကများ ေရာကနြခငး ဟြမင ငသည။ လကတန၍ ဝါးသား
ပါကလညး ပ အလငး အစက များ၏ အေရး အေကာငးက ကည၍ ဝါးေစသည
လငးတနပစ (point spread function) က ခနမနး ငသည။ တနညး အားြဖင မရငး
ြပတသားေသာ ပက၊ degradation function, H(u, v), ြဖင convolution လပထား
သည င တည သည။
တညရာနယ (spatial domain)တင စ းစားပါကဝါးေနေသာ ပက ြပတသားေအာင
၃.၃. WIENER FILTERING ၅၃
လပရနမာ ေပါငးစပ ေနေသာ အစက တနဖး များက ြပနခ ထတသည ငတသည။
နမနာ စ းစား ကညပါကေပါငးလဒကနးတစခကေတပါကထေပါငးလဒမာ မညသည
ကနးများ၏ ေပါငးလဒ ြဖစမညနညးဟ ြပန ာ ရြခငး င တသြဖင မသကနး များက
ြပနရဖ မြဖစ ငပါ။ Unsharpmaskအစ သည shapening filter များမာလညး ကမ နး
ြမငအပငးများက ြမငေပး ေယဘယျ နညးများသာ ြဖစသြဖငအမျ းမျ းေသာအြခား
ဝါးပ ဝါးနညးများ အတက ထေရာကမ မ ပါ။
ကမ နးနယ (frequency domain)တငမ convolutionလပသညမာ ေြမာကြခငး
ငညမသြဖင နဂ မရငးက ြပနလချင ပါကH(u, v) ြဖင ြပနစားလက ပင ြဖစသည။
ဝါးေနေသာပ (degraded image) ၏ DFT မာ G(u, v)၊ ဝါးေစေသာ degradation
function ၏ DFT မာ H(u, v) ဆပါက ခနမနး မရငးပ၏ DFT က ေအာကပါအတငး
inverse function အေန င ြပ ငသည။
F ∩ (u, v) =G(u, v)
H(u, v)(၃.၈)
ဤနညးမာ း ငးသလ ေသာလညး noise များ၊H(u, v)၏တကျမများတင များစာ
မတညလနး သြဖင ရလဒ မေကာငး ြခငးများ၊ ပငးေြခH(u, v)၏သညနားနး တနဖး
များတင စားလဒမာ သတမတ၍ မရ ေတာေသာ ြပဿနာ ြဖစြခငး များ သည။
Wiener Filtering မာမ statistical error က အနညးဆးြဖစေအာင ခနမနး င ပး၊
အေစာဆး င လကက အများဆး ဖယတာ တစခ ြဖစသည။ သ၏ ကမ နးနယ
ေဖာြပ ချကမာ ေအာကပါ အတငး ြဖစသည။
F (u, v) =
1
H(u, v)
|H(u, v)|2
|H(u, v)|2 + Sη(u,v)
Sf (u,v)
G(u, v) (၃.၉)
ထတင H(u, v) = degradation function ြဖစ၍၊ |H(u, v)|2 = H∗(u, v)H(u, v)
ြဖစသည။တဖနH∗(u, v)သညH(u, v)၏complex conjugate ြဖစသည။ Sη(u, v)
= |N(u, v)|2 = noise ၏ power spectrum ြဖစ၍ ၊ Sf (u, v) = |F (u, v)|2 = un-
degraded ပရပ ၏ power spectrum ြဖစသည။ အချ း Sη(u,v)
Sf (u,v)က noise to signal
ratio (NSR) ဟလညး ေခသည။
၅၄ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
Wiener Filtering နမနာက ေအာကပါ deblur.cpp (စာရငး ၃.၂) တင ေတ င
သည။
1 //File: deblur.cpp
2 //Description: Wiener filtering
3 //WebSite: http://cool-emerald.blogspot.com
4 //MIT License (https://opensource.org/licenses/MIT)
5 //Copyright (c) 2017 Yan Naing Aye
6 #include <stdio.h>
7 #include <iostream>
8 #include <opencv2/opencv.hpp>
9 using namespace std;
10 using namespace cv;
11
12 //Create an image of complex number type (2 channels to store
13 // real part and imaginary part) from an input grayscale image
14 // with an optimal size for DFT
15 // src : single channel grayscale image input
16 // dst : two channel complex image output
17 void i2z(Mat src, Mat& dst)
18 {
19 //get optimal size for dft
20 int m = getOptimalDFTSize(src.rows);
21 int n = getOptimalDFTSize(src.cols);
22 //change the image to optimal size, padding 0 values at bottom
and right
23 Mat im_padded;
24 copyMakeBorder(src, im_padded , 0, m - src.rows, 0, n - src.cols,
BORDER_CONSTANT , Scalar::all(0));
25 //convert the image to float type, create another one filled
with zeros ,
26 //and make an array of these 2 images
27 Mat im_array[] = { Mat_<float >(im_padded), Mat::zeros(im_padded.
၃.၃. WIENER FILTERING ၅၅
size(), CV_32F) };
28 //combine as a 2 channel image to represent a complex number
type image
29 Mat im_complex; merge(im_array , 2, im_complex);
30 im_complex.copyTo(dst);//copy to destination
31 }
32
33 // convert a 2 channel complex image to a single channel
grayscale image
34 // by getting magnitude , change scale , and normalize
35 // src : two channel complex image input
36 // dst : single channel grayscale image output
37 // LogScale : change to log scale or not
38 void z2i(Mat src, Mat& dst, bool LogScale = false)
39 {
40 Mat im_tmp[2]; split(src, im_tmp);//split the complex image to 2
41 Mat im_f; magnitude(im_tmp[0], im_tmp[1], im_f);//get absolute
value
42 if (LogScale) {
43 im_f += Scalar::all(1);//make minimum 1
44 log(im_f, im_f);//log scale
45 }
46 Mat im;
47 normalize(im_f, im, 0, 255, NORM_MINMAX , CV_8U); //normalize
48 im.copyTo(dst);//copy to destination
49 }
50
51 // rearrange the quadrants of a Fourier image
52 void fftshift(Mat src) {
53 // make number of rows or columns even
54 src = src(Rect(0, 0, src.cols & -2, src.rows & -2));
55 int cx = src.cols / 2;
56 int cy = src.rows / 2;
၅၆ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
57 Mat q1(src, Rect(cx, 0, cx, cy));// Top-Right
58 Mat q2(src, Rect(0, 0, cx, cy));// Top-Left
59 Mat q3(src, Rect(0, cy, cx, cy));// Bottom -Left
60 Mat q4(src, Rect(cx, cy, cx, cy));// Bottom -Right
61 Mat tmp;
62 q2.copyTo(tmp);
63 q4.copyTo(q2);
64 tmp.copyTo(q4);
65 q1.copyTo(tmp);
66 q3.copyTo(q1);
67 tmp.copyTo(q3);
68 }
69
70 //Produce Gaussian filter in frequency domain
71 // height : height of the filter
72 // width : width of the filter
73 // std : standard deviation where intensity is 60% (like
cutoff frequency )
74 // highpass: true=highpass , false=lowpass
75 Mat GaussianFilter(int height, int width, float std, bool
highpass = false)
76 {
77 Mat im_filter = Mat::ones(Size(width, height), CV_32F);
78 float u, v, t;
79 int k = 0;
80 for (long i = 0; i < height; i++)
81 for (long j = 0; j < width; j++) {
82 u = i - height / 2;
83 v = j - width / 2;
84 t = exp(-(u*u + v*v) / (2.0*std*std));
85 if (highpass) t = 1 - t;//if high pass
86 im_filter.at<float >(i, j) = t;
87 }
၃.၃. WIENER FILTERING ၅၇
88 return im_filter;
89 }
90
91 //Produce Butterworth filter in frequency domain
92 // height : height of the filter
93 // width : width of the filter
94 // cutoffFreq:cutoff frequency where intensity is 50%
95 // order : order n
96 // highpass: true=highpass , false=lowpass
97 Mat ButterworthFilter(int height, int width, float cutoffFreq ,
int order, bool highpass = false)
98 {
99 Mat im_filter = Mat::ones(Size(width, height), CV_32F);
100 float u, v, t;
101 int k = 0;
102 for (long i = 0; i < height; i++)
103 for (long j = 0; j < width; j++) {
104 u = i - height / 2;
105 v = j - width / 2;
106 t = (u*u + v*v) / (cutoffFreq*cutoffFreq);
107 if (highpass) t = 1 / t;//if high pass
108 for (long k = 1; k < order; k++) t *= t;//for order n
109 t = 1 / (1 + t);
110 im_filter.at<float>(i, j) = t;
111 }
112 return im_filter;
113 }
114
115 int main(int argc, char** argv)
116 {
117 //Get an image
118 Mat image = imread("C:/opencv/blur.jpg", IMREAD_GRAYSCALE);
119 if (!image.data) {printf("No image data \n");return -1;}
၅၈ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
120 namedWindow("Original Image", WINDOW_AUTOSIZE);
121 imshow("Original Image", image);
122
123 Mat im_complex; i2z(image, im_complex);//convert to complex type
124 dft(im_complex , im_complex);//perform discrete fourier transform
125 Mat im_co; im_complex.copyTo(im_co);//keep original DFT copy
126
127 //Estimate Signal power spectrum , take low freq part as signal
128 //Get a low pass filter (freq domain)
129 Mat im_filter = ButterworthFilter(im_complex.rows, im_complex.
cols, 100,2,false);
130 fftshift(im_filter);//shift quadrants for matching
131 //multiply in freq domain (convolve in spatial domain)
132 Mat im_array[2]; split(im_complex , im_array);
133 im_array[0] = im_array[0].mul(im_filter);
134 im_array[1] = im_array[1].mul(im_filter);
135 merge(im_array , 2, im_complex);//combine these 2 into a complex
image
136
137 dft(im_complex , im_complex , DFT_INVERSE);//perform inverse
discrete fourier transform
138 Mat im_signal; z2i(im_complex , im_signal);//get grayscale
139
140 //Estimate noise
141 Mat imsps = Mat_<float >(im_signal);//convert image signal to
float
142 Mat imor = Mat_<float>(image);//convert original image to float
143 Mat imnps = imor - imsps;//get noise
144
145 //Signal to noise ratio
146 imsps = imsps.mul(imsps);//get signal power spectrum
147 imnps = imnps.mul(imnps);//get noise power spectrum
148 float signalpower = sum(imsps)[0];
၃.၃. WIENER FILTERING ၅၉
149 float noisepower = sum(imnps)[0];
150 float snr = signalpower / noisepower;
151 printf("snr: %f \n", snr);
152
153 //Get the known degrading function
154 Mat im_df = GaussianFilter(im_complex.rows, im_complex.cols, 50,
false);
155 fftshift(im_df);//shift quadrants for matching
156
157 //Wiener filtering
158 Mat h2 = im_df.mul(im_df);//magnitude square
159 Mat dbH = (h2 / (h2 + (1 / snr)))/im_df;
160 //multiply in freq domain (convolve in spatial domain)
161 Mat im_coar[2]; split(im_co, im_coar);
162 im_coar[0] = im_coar[0].mul(dbH);
163 im_coar[1] = im_coar[1].mul(dbH);
164 merge(im_coar, 2, im_co);//combine these 2 into a complex image
165
166 //Convert the DFT result into grayscale
167 dft(im_co, im_co, DFT_INVERSE); //perform inverse discrete
fourier transform
168 Mat im_deblur; z2i(im_co, im_deblur);//get grayscale
169 namedWindow("Deblurred Image", WINDOW_AUTOSIZE);
170 imshow("Deblurred Image", im_deblur);
171
172 //save the result
173 imwrite("C:/opencv/deblur.jpg", im_deblur);
174 waitKey(0);
175 return 0;
176 }
စာရငး ၃.၂: Wiener Filtering
၆၀ အခနး ၃. ကမ နးနယတငြပ စပြခငးများ
ပ ဂရမ၏ ရလဒက ေအာကပါပ ၃.၄ တငေတ ငသည။
ပ ၃.၄: Noise ထ၍ ဝါးေနေသာပက Wiener filter ြဖင deblur လပ ပးသည အခါ
ရလာေသာ ရလဒ။
၃.၄ Source ကဒများ
ဤအခနး ပ ဂရမများ၏ sourceကဒများက ေအာကပါ ေနရာများတင ေတ ငသည။
• Image Filtering in Frequency Domain - https://github.com/yan9a/ OpenCV
_Frequency _Domain
• Deblurring an image using Wiener filter - https://github.com/yan9a/
OpenCV _Wiener _Filter
အခနး ၄
ဗဒယြပ စပြခငး
ဤအခနးတင ဗဒယများက ဖတြခငး၊ ေရးြခငး၊ ငအချန ငတေြပးည ခြခမး၊ ာေဖြခငးများ
အေကာငးတငြပမည။ ဗဒယ ဆသညမာ ပရပများ အစအစ လက ေပါငးစပ ြပလပ
ထားသညဟဆ ငသည။ထသ ဖစညးထားသည ပရပတစခ ြခငးစက ြပကက (frame)
ဟေခ ပး၊ တစစကနအတငး ေြပာငးလသားသည ြပကက အေရအတကက ြပ နး
(frame rate) ဟေခ မည [15]။
၄.၁ ဗဒယ ဖတြခငး၊ေရးြခငး
OpenCVတင ဗဒယများက ဖမးယရနသမဟတ ဖတရန VideoCaptureဟေခသည
class ပါ သည [16]။ ဗဒယ ဖငများ ေရးသားရနအတကက မ VideoWriter Class
ကသး ငသည [17]။ စကထတငသမးထားသည ဗဒယ ဖငတစခက ဖတကာ၊ ြပကက
တစခြခငးစထတယ ပး၊လက အချနက စတဂကက ေနာကခ ငထြပကကေပထပေရး
မည။ ရလာသည ရလဒက ဗဒယဖငအေန င ြပနေရးသည နမနာတစခက ေအာကပါ
စာရငး ၄.၁ တင ေဖာြပထားသည။ ပေပတင စာသားများေရးြခငး အတက putText
[18] က သးသည။
1 #include <stdio.h>
2 #include <iostream>
၆၁
၆၂ အခနး ၄. ဗဒယြပ စပြခငး
3 #include <opencv2/opencv.hpp>
4 #include <string>
5 using namespace std;
6 using namespace cv;
7 std::string to_string(int i)
8 {
9 std::stringstream ss;
10 ss << i;
11 return ss.str();
12 }
13 int main(int argc, char** argv)
14 {
15 //VideoCapture cap(0);//Default camera
16 VideoCapture cap("/home/yan/sensor.mp4");//open video file
17 //VideoCapture cap("c:/opencv/sensor.mp4"); //open video file
18 if (!cap.isOpened()) {
19 printf("Video is not opened. \n");
20 return -1;
21 }
22 else {
23 printf("Video is opened. \n");
24 }
25
26 union { int v; char c[5]; } uEx;
27 uEx.v = static_cast <int>(cap.get(CV_CAP_PROP_FOURCC));
28 uEx.c[4] = '\0';
29 printf("Codec: %s \n",uEx.c);
30
31 Size S = Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),(int)cap.get
(CV_CAP_PROP_FRAME_HEIGHT));
32 printf("Frame size: %d x %d \n",S.width,S.height);
33
34 double rate = cap.get(CV_CAP_PROP_FPS);//Frame rate
၄.၁. ဗဒယ ဖတြခငး၊ေရးြခငး ၆၃
35 printf("Frame rate: %f \n", rate);
36 int dperiod = 1000 / rate;
37
38 int c = cap.get(CV_CAP_PROP_FRAME_COUNT);
39 printf("Frame count: %d \n", c);
40 namedWindow("Frame", 1);
41
42 int ex = CV_FOURCC('M', 'J', 'P', 'G');
43 //int ex = CV_FOURCC('X', 'V', 'I', 'D');//https://www.xvid.com/
44 //int ex = -1;//pop up window to choose
45 //const string vpath="c:/opencv/vdowr.avi";
46 const string vpath="/home/yan/vdowr.avi";
47 VideoWriter outputVideo(vpath, ex , rate, S, true);
48 if (!outputVideo.isOpened())
49 {
50 cout << "Could not open the output video to write."<< endl;
51 waitKey(5000);
52 return -1;
53 }
54
55 long ms,p;
56 Mat frame,img;
57 string str;
58 for (int i = 0;; i++) {
59 if (!cap.read(frame)) break;
60 p = cap.get(CV_CAP_PROP_POS_FRAMES);
61 //printf("Frame: %ld \n", p);
62 ms = cap.get(CV_CAP_PROP_POS_MSEC);
63 str = to_string(ms) + " ms";
64 rectangle(frame, Point(10, 10), Point(200, 60), CV_RGB(255, 0,0)
, CV_FILLED);
65 putText(frame, str, Point(25, 45),FONT_HERSHEY_PLAIN ,2.0, CV_RGB
(0, 255, 0), 2.0);
၆၄ အခနး ၄. ဗဒယြပ စပြခငး
66 outputVideo << frame;
67 imshow("Frame", frame);
68 if (waitKey(dperiod) == 27) break; //if 'Esc' key is pressed
69 }
70 cap.release();
71 outputVideo.release();
72 //waitKey(5000);
73 return 0;
74 }
စာရငး ၄.၁: ဗဒယဖတြခငး၊ေရးြခငး။
၄.၂ Real-time Face Detection
ဗဒယအတငးမ မျက ာများအားအချန ငတေြပးည ာေဖြခငးက ြပလပမည။ထအတက
Cascade Classifier [19] ကသး ငသည။ နမနာ ပ ဂရမက ေအာကပါ စာရငး ၄.၂
တင ေတ ငသည။
1 #include <stdio.h>
2 #include <opencv2/opencv.hpp>
3 #include<string>
4 using namespace std;
5 using namespace cv;
6
7 String face_cascade_name = "c:/opencv/
haarcascade_frontalface_alt.xml";
8 String eyes_cascade_name = "c:/opencv/
haarcascade_eye_tree_eyeglasses.xml";
9 CascadeClassifier face_cascade;
10 CascadeClassifier eyes_cascade;
11
၄.၂. REAL-TIME FACE DETECTION ၆၅
12 void detectAndDisplay(Mat frame)
13 {
14 std::vector<Rect> faces;
15 Mat frame_gray;
16
17 cvtColor(frame, frame_gray , CV_BGR2GRAY);
18 equalizeHist(frame_gray , frame_gray);
19
20 //-- Detect faces
21 face_cascade.detectMultiScale(frame_gray , faces, 1.1, 2, 0 |
CV_HAAR_SCALE_IMAGE , Size(120, 120));
22
23 for (size_t i = 0; i < faces.size(); i++)
24 {
25 Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces
[i].height*0.5);
26 ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height
*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
27
28 Mat faceROI = frame_gray(faces[i]);
29 std::vector<Rect> eyes;
30
31 //-- In each face, detect eyes
32 eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 |
CV_HAAR_SCALE_IMAGE , Size(30, 30));
33
34 for (size_t j = 0; j < eyes.size(); j++)
35 {
36 Point center(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i
].y + eyes[j].y + eyes[j].height*0.5);
37 int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
38 circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);
39 }
၆၆ အခနး ၄. ဗဒယြပ စပြခငး
40 }
41 //-- Show what you got
42 imshow("Frame", frame);
43 }
44
45 int main(int argc, char** argv)
46 {
47 //Load the cascades
48 if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error
loading\n"); return -1; };
49 if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error
loading\n"); return -1; };
50
51 VideoCapture cap(0);//Default camera
52 if (!cap.isOpened()) { printf("Video is not opened. \n"); return
-1; }
53 else { printf("Video is opened. \n"); }
54
55 union { int v; char c[5]; } uEx;
56 uEx.v = static_cast <int>(cap.get(CV_CAP_PROP_FOURCC));
57 uEx.c[4] = '\0';
58 printf("Codec: %s \n", uEx.c);
59
60 cap.set(CAP_PROP_FRAME_WIDTH , 1280);
61 cap.set(CAP_PROP_FRAME_HEIGHT , 720);
62 cap.set(CAP_PROP_FPS , 30);
63 Size S = Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH), (int)cap.
get(CV_CAP_PROP_FRAME_HEIGHT));
64 printf("Frame size: %d x %d \n", S.width, S.height);
65
66 double rate = cap.get(CV_CAP_PROP_FPS);//Frame rate
67 printf("Frame rate: %f \n", rate);
68 int dperiod = 15;
၄.၂. REAL-TIME FACE DETECTION ၆၇
69
70 long p = 0;
71 Mat frame, img;
72 string str;
73 for (int i = 0;; i++) {
74 if (!cap.read(frame)) break;
75 detectAndDisplay(frame);
76 if (waitKey(dperiod) == 27) break; //if 'Esc' key is pressed
77 }
78 cap.release();
79 //waitKey(5000);
80 return 0;
81 }
စာရငး ၄.၂: ဗဒယဖတြခငး၊ေရးြခငး။
ဤ ပ ဂရမ တင မျက ာက ာေဖရန “haarcascade_frontalface_alt.xml” င
မျကလး များအား ာေဖရန“haarcascade_eye_tree_eyeglasses.xml”ဆသည ဖငများ
အားသးပါမည။ထဖငများသည “C:/opencv/opencv320/sources/data/haarcascades”
သမဟတ “/home/username/opencv/data/haarcascades” ေအာကတင သည။
မျက ာ င မျကလးများအတက CascadeClassfier object စခက ေကြငာ ပး၊ load
ကသး၍ အဆပါ ဖငများအား ဖတသည။
အချန ငတေြပးည ဗဒယ ကရန VideoCapture objectက ေကြငာသည အခါ
ဖငနာမည အစား 0 ကသးသည အတက သင ကနပျ တာ တင တပဆငထားေသာ
ကငမရာက သးသည။ VideoCapture ၏ get ကသး၍ လက ဗဒယ၏ setting
များက ဖတ င ပး၊ setကသး၍လသလ ြပင ငသည။ဤပ ဂရမတင ြပကကအရယ
အစား င ြပ နးက set င ြပငလကသည။ ထေနာက ြပကက တစခြခငး ဖတ၍ de-
tectAndDisplay ဖန ငက သးကာ မျက ာ ာ၍ ဝငးြပသည။
detectAndDisplay ဖန ငတင ပရပက အြဖ အမညး ေြပာငး၍ detectMulti-
Scale ကသး၍ ာသည။ သ၏ ပစမာ ေအာကပါ အတငး ြဖစသည။
၆၈ အခနး ၄. ဗဒယြပ စပြခငး
void CascadeClassifier::detectMultiScale(const Mat& image,
vector<Rect>& objects, double scaleFactor=1.1,
int minNeighbors=3, int flags=0,
Size minSize=Size(), Size maxSize=Size())
ပထမ Parameters ြဖစသည image မာ ာလသည ပရပြဖစ ပး၊ ဒတယ objects
တင ာေတသည ေနရာများ၏ စတဂ များအား သမးေပးမည။ ထေနာက ာေတသည
ေနရာ င အရယများက သး၍ circle င စကဝငးများ ဆ၍ ပက imshow င ြပေပး
သည။ ေအာကပါ ပ ၄.၁ တင တချန င တေြပးည မျက ာ ာေဖြခငး င ရလာသည
ပတက ြပထားသည။
ပ ၄.၁: တချန င တေြပးည မျက ာ ာေဖြခငး။
၄.၃ Source ကဒများ
ဤအခနး ပ ဂရမများ၏ sourceကဒများက ေအာကပါ ေနရာများတင ေတ ငသည။
၄.၃. SOURCE ကဒများ ၆၉
• OpenCVVideo Processing - https://github.com/yan9a/OpenCV _Video
_Processing
• Real-time Face Detection - https://github.com/yan9a/Real-time _Face
_Detection
အခနး ၅
ပရပခြခမးသးသပ ာေဖြခငးများ
ဤအခနးတင ပရပ များအား ခြခမးစစစြခငး၊သးသပြခငး၊ ာေဖြခငး များအား ြပလပမည။
၅.၁ Connected Component Labeling
Connected component labelingသည binary imageတစခတင ေသာဆကစပေနသည
region များက မတညသည label များတပေပးသည။ဤalgorithmသည ပရပတစခက
စေခါကသာ စစရနလသြဖင floodfill စသည နညးများ င ငးယ လျငထေရာကြမနဆနမ
များစာသာလနသည။ သ၏ ပစမာ ေအာကပါအတငးြဖစသည [20]။
int cv::connectedComponents ( InputArray image,
OutputArray labels,
int connectivity = 8,
int ltype = CV_32S
)
ဆကစပေနသည regionအေရအတက စစေပါငးN က return ြပနေပးသည။ Label
များမာ [0, N−1] ြဖစ ပး၊ ၀ မာ ေနာကခအပငးအတက label ြဖစသည။ ေနာကတစမျ းမာ
connectedComponentsWithStats ြဖစ ပး၊ဆကစပေနေသာ region များအား ာေပး
၇၀
၅.၁. CONNECTED COMPONENT LABELING ၇၁
သည အြပင၊ သတ၏ ဂျဩေမတ ဗဟ (centroid)၊ အကျယအဝနး (area)၊ ေနရာ
စသညတက ပါတကချက ေပးသည။ သ၏ ပစမာ ေအာကပါအတငးြဖစသည။
int cv::connectedComponentsWithStats ( InputArray image,
OutputArray labels,
OutputArray stats,
OutputArray centroids,
int connectivity = 8,
int ltype = CV_32S
)
stats က stats(label, COLUMN) ြဖင ရယ င ပး column မာ
CC_STAT_LEFT
CC_STAT_TOP
CC_STAT_WIDTH
CC_STAT_HEIGHT
CC_STAT_AREA
CC_STAT_MAX
တမ တစခခ ြဖစသည။ သတ၏ နမနာက ေအာကပါ စာရငး ၅.၁ တင ေတ ငသည။
1 #include <stdio.h>
2 #include <iostream>
3 #include <opencv2/opencv.hpp>
4
5 using namespace std;
6 using namespace cv;
7
8 int main()
9 {
10 //Read original image
၇၂ အခနး ၅. ပရပခြခမးသးသပ ာေဖြခငးများ
11 Mat src;
12 src = imread("C:/opencv/ka_ori.jpg", 0);
13 if (!src.data) { printf("No image data \n"); return -1; }
14
15 // scale - to make it convenient to print out and see
16 Mat ims; resize(src, ims, Size(16, 8));
17 Mat imb; threshold(ims, imb, 128, 255, CV_8U);// make binary
18
19 namedWindow("Original Image", WINDOW_AUTOSIZE);
20 imshow("Original Image", imb);
21 cout << "Original" << endl << imb << endl << endl;
22
23 //Connected components
24 Mat imr; int N=connectedComponents(imb, imr);
25 cout << "CCL" << endl << imr << endl << endl;
26 cout<<"Number of components: "<< N-1 << endl;// 0 is background
27
28 //Connected components with stats
29 Mat cc, sts, ctd; N=connectedComponentsWithStats(imb, cc, sts,
ctd, 8);
30
31 //get area column except background
32 Mat A(sts, Rect(CC_STAT_AREA , 1, 1, sts.rows - 1));
33
34 // Localizing the biggest component
35 double minVal, maxVal;
36 Point minLoc, maxLoc;
37 minMaxLoc(A, &minVal, &maxVal, &minLoc, &maxLoc);
38 printf("Max area is %lf at label %d .\n", maxVal, (maxLoc.y + 1)
);
39
40 printf("Centroid of the biggest component: [%f,%f] \n", ctd.at<
double >(maxLoc.y + 1, 0), ctd.at<double >(maxLoc.y + 1, 1));
၅.၁. CONNECTED COMPONENT LABELING ၇၃
41
42 waitKey(0);
43 return 0;
44 }
စာရငး ၅.၁: ဆကစပေနေသာ နယေြမ များအား ာြခငး။
ပ ၅.၁: ဆကစပေနေသာ နယေြမ များအား အစကတနဖး တစခြခငး အေန င
ေတ င ပး၊ သတ၏ label များ၊ အေရအတက၊ အကးဆး နယေြမ၏အကျယအဝနး၊
ဗဟတက ေဖာြပထားသည။
အစတင ပရပအစကတနဖး များက ကြပကာအလယအက ြပနစစ ငရနအတက၊
ေသးငယသညအရယအစား 16 x 8အြဖစ resizeကသး၍ေြပာငးလကသည။ထေနာက
binary ပ ပ ရေစရန threshold င ေြပာငး ပး မရငးပ က ြပသည။ 16 x 8 အရယ
သာြဖစသြဖငအလနေသးငယသည။ထေနာကအစကတစခ ြခငးစ၏တနဖးက cout
င ကြပသည အတက console တင ဆကစပေနေသာ အစကများက မျကစြဖင
၇၄ အခနး ၅. ပရပခြခမးသးသပ ာေဖြခငးများ
ြမင ငသည။
connectedComponentsကသး၍ရ လာေသာ label များက cout၏အထကတင
ြမင ငသည။ Region များ၏ အေရအတကက ေတ င ပး၊ stats ၏ area များက
ထတယသည။ ထေနာက minMaxLoc ြဖင အကးဆး နယေြမက ာကာ သ၏ cen-
troid များ ာသည။ ပ ဂရမ၏ ရလဒက ပ ၅.၁ တငေတ ငသည။
၅.၂ Template Matching
ပရပတစခတငသတမတထားေသာ ပစ နမနာ ငကကညသည ေနရာက ာေဖြခငးအား
TemplateMatchingဟေခ မည။ထသ ာေဖရနmatchTemplate [21]ကသး ငသည။
သ၏ ပစမာ ေအာကပါအတငးြဖစသည။
void cv::matchTemplate ( InputArray image,
InputArray templ,
OutputArray result,
int method,
InputArray mask = noArray()
)
Template matching methodမာ ေအာကပါတမ တစခခ ြဖစ ငသည။
TM_SQDIFF
TM_SQDIFF_NORMED
TM_CCORR
TM_CCORR_NORMED
TM_CCOEFF
TM_CCOEFF_NORMED
နမနာ ပ ဂရမက ေအာကပါ စာရငး ၅.၂ တင ေတ ငသည။
၅.၂. TEMPLATE MATCHING ၇၅
1 #include "opencv2/highgui/highgui.hpp"
2 #include "opencv2/imgproc/imgproc.hpp"
3 #include <iostream>
4 #include <stdio.h>
5
6 using namespace std;
7 using namespace cv;
8
9 /// Global Variables
10 Mat img; Mat templ; Mat result;
11 int match_method;
12
13 void MatchingMethod(int, void*)
14 {
15 // Source image to display with rectangle overlay
16 Mat img_display;
17 img.copyTo(img_display);
18
19 // Do the Matching and Normalize
20 matchTemplate(img, templ, result, match_method);
21 normalize(result, result, 0, 1, NORM_MINMAX);
22
23 // Localizing the best match with minMaxLoc
24 double minVal, maxVal;
25 Point minLoc, maxLoc, matchLoc;
26 minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
27
28 // For SQDIFF and SQDIFF_NORMED , the best matches are lower
values.
29 // For all the other methods , the higher the better
30 if (match_method == CV_TM_SQDIFF || match_method ==
CV_TM_SQDIFF_NORMED) { matchLoc = minLoc; }
၇၆ အခနး ၅. ပရပခြခမးသးသပ ာေဖြခငးများ
31 else { matchLoc = maxLoc; }
32
33 // Show me what you got
34 Point matchLoc2(matchLoc.x + templ.cols, matchLoc.y + templ.rows
);
35 rectangle(img_display , matchLoc , matchLoc2 , Scalar::all(0), 2,
8, 0);
36 rectangle(result, matchLoc , matchLoc2 , Scalar::all(0), 2, 8, 0);
37 imshow("Source", img_display);
38 imshow("Result", result);
39 }
40
41 int main()
42 {
43 /// Load image and template
44 img = imread("c:/opencv/stand.jpg");
45 templ = imread("c:/opencv/template.jpg");
46
47 /// Create windows
48 namedWindow("Source", CV_WINDOW_AUTOSIZE);
49 namedWindow("Result", CV_WINDOW_AUTOSIZE);
50 namedWindow("Template", CV_WINDOW_AUTOSIZE);
51 imshow("Template", templ);
52 /// Create Trackbar
53 createTrackbar("Method: ", "Source", &match_method , 5,
MatchingMethod);
54 MatchingMethod(0, 0);
55
56 waitKey(0);
57 return 0;
58 }
စာရငး ၅.၂: သတမတ ထားေသာ ပစ တစခ င ကကညေသာ ေနရာ အား ာေဖြခငး။
၅.၂. TEMPLATE MATCHING ၇၇
ဤ ပ ဂရမတင မရငးပ င ာေဖလသည ပစ (template) တက ဖတ ပး၊ track-
bar မ ေရးချယသည matchingmethodအတငး template ငအကကညဆး ေနရာ
က မရငးပတင ာသည။ Template matching တက၍ရသည တနဖးများက result
window တင ြပသည။
ရလဒများမာ CV_TM_SQDIFF င CV_TM_SQDIFF_NORMEDနညးများအတက
တနဖးအငယဆး မာ ကကညမ အ ဆး ေနရာ ြဖစ ပး၊ ကျနေသာ နညးများ အတကမ
တနဖး အကးဆးမာကကညမ အ ဆး ေနရာြဖစသည။ ထအတက minMaxLoc က
သးသည။အကကညဆးေနရာတင မရငးပ င ရလဒများ၌ စတဂပ ငြပသည။ ပ ဂရမ
၏ ရလဒ က ပ ၅.၂ တင ေတ ငသည။
ပ ၅.၂: Template matching လပ၍ရေသာ ပ။
၇၈ အခနး ၅. ပရပခြခမးသးသပ ာေဖြခငးများ
၅.၃ Harris Corner Detector
ဤ အပငးတင အသငအြပငများ ာေဖြခငး (feature detection) နမနာ အေန င
cornerHarrisကသးကာHarris-Stephensmethod င ပရပတစခ ေထာငများအား
ာေဖြခငး အေကာငး တငြပမည [22]။ cornerHarris ၏ ပစ မာ ေအာကပါ အတငး
ြဖစသည။
void cornerHarris(InputArray src, OutputArray dst,
int blockSize, int ksize, double k,
int borderType=BORDER_DEFAULT )
နမနာ ပ ဂရမက စာရငး ၅.၃ တငေဖာြပထားသည။
1 #include "opencv2/highgui/highgui.hpp"
2 #include "opencv2/imgproc/imgproc.hpp"
3 #include <iostream>
4 #include <stdio.h>
5
6 using namespace std;
7 using namespace cv;
8
9 int main()
10 {
11 /// Load image and template
12 Mat img = imread("c:/opencv/stand.jpg", 0);
13 namedWindow("Source", CV_WINDOW_AUTOSIZE);
14 imshow("Source", img);
15 // Detect Harris Corners
16 Mat cornerStrength;
17 cornerHarris(img, cornerStrength , 3, 3, 0.01);
18 normalize(cornerStrength , cornerStrength , 0, 255, NORM_MINMAX ,
CV_8U);
19 namedWindow("Corner Strength", CV_WINDOW_AUTOSIZE);
၅.၃. HARRIS CORNER DETECTOR ၇၉
20 imshow("Corner Strength", cornerStrength);
21 // threshold the corner strengths
22 Mat harrisCorners;
23 threshold(cornerStrength , harrisCorners , 24, 255, cv::
THRESH_BINARY);
24 namedWindow("Corners", CV_WINDOW_AUTOSIZE);
25 imshow("Corners", harrisCorners);
26 waitKey(0);
27 return 0;
28 }
စာရငး ၅.၃: ေထာငအသငအြပင များအား ာေဖြခငး။
ပ ဂရမ တင ပရပတစခ က ဖတကာ cornerHarris င ေထာင အသငအြပငများ
၏ ေတ မ ြပငးအား (corner strength) ကတကသည။ ထေနာက threshold င
ြဖတချကာ ေထာငများက ေဖာြပသည။ ပ ဂရမ၏ရလဒက ပ ၅.၃တင ေတ ငသည။
ပ ၅.၃: ေထာင အသငအြပင များက ာေဖြခငး။
၈၀ အခနး ၅. ပရပခြခမးသးသပ ာေဖြခငးများ
၅.၄ ြမနမာ ငင၏ဗဟ
ပသ ာနတစခ၏ geometric center က centroid, C =[CX CY
]T, ဟေခ ပး
ေအာကပါ ညမ ြခငး များြဖင ာ ငသည။
CX =
∑(x× i(x, y))∑
i(x, y)(၅.၁)
CY =
∑(y × i(x, y))∑
i(x, y)(၅.၂)
ထတင x င y မာ pixel တစခြခငးစ၏ coordinates ေနရာြဖစ ပး၊ i(x, y) မာ ထ
သကဆင ရာ pixel ၏ intensity တနဖးြဖစသည။
နမနာ အေန င ြမနမာ ငင ေြမပ၏အလယဗဟ က ာမည။ထအတက Google
Maps တင ြမနမာ ငင၏ ေြမပက screen shot ရယကာ GIMP တင edit လပ၍
အြဖ အမညး ေြပာငးလကမည (ပ ၅.၄)။ ပအတက crop ြဖတလကေသာ border
လတကျ ၊ ေလာငဂျကျ များမာ
• ေြမာကဘက ၂၈.၅၅◦
• ေတာငဘက ၉.၈၄◦
• အေ ဘက ၁၀၁.၁၇◦
• အေနာကဘက ၉၂.၁၇◦
တ ြဖစသည။ Googlemaps မာMercator projectionသးထားသြဖငညမ ြခငး (၅.၁)
င (၅.၂) တတင အစကတစခြခငး စ၏ normalized ဧရယာ မာ အေကတာ အတက
1 ဆပါက လတကျ ϕ အလက ဧရယာ မာ cos(ϕ) ြဖစသည။ ြမနမာြပည ေြမပ၏
အလယဗဟအား ာေဖသည ပ ဂရမက စာရငး ၅.၄ တငေဖာြပထားသည။
1 #include <stdio.h>
2 #include <math.h>
3 #include <opencv2/opencv.hpp>
၅.၄. ြမနမာ ငင၏ဗဟ ၈၁
(a) Google maps ြမနမာ ငင
ေြမပ။
(b) GIMP က သး၍
အြဖ အမညး ေြပာငး ပးပ။
ပ ၅.၄: ြမနမာ ငင ေြမပအား Google maps မရယလကေသာ မရငး င၊ GIMP
ကသး၍ အစနး များ င အတ crop လပ၊ အြဖ အမညး ေြပာငးထားပ။
၈၂ အခနး ၅. ပရပခြခမးသးသပ ာေဖြခငးများ
4 #include <iostream>
5 using namespace std;
6 using namespace cv;
7 int main()
8 {
9 Mat image;
10 image = imread("C:/opencv/MyanmarMap6.PNG", IMREAD_GRAYSCALE);
11 if (!image.data) { printf("No image data \n"); return -1; }
12 namedWindow("Display Image", WINDOW_AUTOSIZE);
13 imshow("Display Image", image);
14
15 double latNorth = 28.55;
16 double latSouth = 9.84;
17 double logEast = 101.17;
18 double logWest = 92.17;
19
20 double sxi = 0, syi = 0;//for image
21 double slat = 0, slog = 0;//for latitude and longitude
22 double cslat = 0, cslog = 0;//with compensation for
23 // Universal Transverse Mercator (UTM) coordinate system
24 double si = 0;
25 double ilat, jlog;
26 double ci = 0;//compensated intensity
27 double sci = 0;//summation of ci
28 const double PI = 2 * acos(0.0);//get PI
29 //Manipulate pixels
30 long h = image.rows;
31 long w = image.cols;
32 long ithreshold = 138;
33 for (long i = 0; i < h; i++)
34 for (long j = 0; j < w; j++)
35 if (image.at<uchar >(i, j) > ithreshold) {
36 si += 1;//uniform pixel intensity
၅.၄. ြမနမာ ငင၏ဗဟ ၈၃
37 sxi += j;
38 syi += i;
39
40 ilat = latNorth - (latNorth - latSouth)*double(i) / double(h -
1);
41 jlog = logWest + (logEast - logWest)*double(j) / double(w - 1);
42 slog += jlog;
43 slat += ilat;
44
45 ci = cos(ilat*PI / 180.0);
46 sci += ci;
47 cslog += jlog*ci;
48 cslat += ilat*ci;
49 }
50
51 //image centroid
52 double cx = sxi / si;
53 double cy = syi / si;
54
55 //latitude and longitude centroid
56 double lat = slat / si;
57 double log = slog / si;
58
59 //compensated latitude and longitude centroid
60 double clat = cslat / sci;
61 double clog = cslog / sci;
62
63 printf("Centroid row col: [ %f , %f ] for image pixels. \n", cx,
cy);
64 printf("Centroid lat log: [ %f , %f ] \n", lat, log);
65 printf("Centroid lat log: [ %f , %f ] after compensation for
Mercator projection.\n", clat, clog);
66
၈၄ အခနး ၅. ပရပခြခမးသးသပ ာေဖြခငးများ
67 waitKey(0);
68 return 0;
69 }
စာရငး ၅.၄: ြမနမာြပည ေြမပ၏ အလယဗဟအား ာေဖြခငး။
ပ ဂရမမ တကေပးေသာ ြမနမာ ငင၏ အလယဗဟမာ Mercator projection အား
ထည စ းစား ပါက လတကျ ၂၀.၈၆ င ေလာငဂျကျ ၉၆.၄၈ တ ြဖစသည။ Google
mapsတင 20.86,96.48ဟ ာပါကေအာကပါ ပ ၅.၅အတငး ဗဟေနရာအား ေတ င
သည။
ပ ၅.၅: ြမနမာြပည ေြမပ၏ အလယဗဟ။
၅.၅. SOURCE ကဒများ ၈၅
၅.၅ Source ကဒများ
ဤအခနး ပ ဂရမများ၏ sourceကဒများက ေအာကပါ ေနရာများတင ေတ ငသည။
• Connected Component Labeling - https://github.com/yan9a/Connected
_Component _Labeling
• Template Matching - https://github.com/yan9a/Template _Matching
• Harris Corner Detector - https://github.com/yan9a/Harris _Corner _De-
tector
• Centroid ofMyanmar - https://github.com/yan9a/Myanmar _Centroid
Appendix A
ေနာကဆကတ ငးလငးချက
၁.၁ ThresholdTypes
ThresholdTypesတစခစအတကသချာညမ ြခငး ြဖင ေဖာြပချက များက ေအာကပါ
ဇယား ၁.၁ ေတ ငသည။
၈၆
၁.၁. THRESHOLDTYPES ၈၇
ဇယား ၁.၁: Threshold အမျ းအစားများ၏ ညမ ြခငးများ။
THRESH_BINARY dst(x, y) =
maxval, if src(x, y) > thresh
0, otherwise
THRESH_BINARY_INV dst(x, y) =
0, if src(x, y) > thresh
maxval, otherwise
THRESH_TRUNC dst(x, y) =
thresh, if src(x, y) > thresh
src(x, y), otherwise
THRESH_TOZERO dst(x, y) =
src(x, y), if src(x, y) > thresh
0, otherwise
THRESH_TOZERO_INV dst(x, y) =
0, if src(x, y) > thresh
src(x, y), otherwise
THRESH_MASK
THRESH_OTSU flag ြဖစပါတယ။ Otsu algorithm ကသး ပး
optimal threshold တနဖးက ေရးဖပါ။
THRESH_TRIANGLE flag ြဖစပါတယ။ Triangle algorithm ကသး ပး
optimal threshold တနဖးက ေရးဖပါ။
အကးအကားများ
[1] OpenCV, “Open source computer vision,” (http://opencv.org/).
[2] OpenCV, “Introduction to opencv,” (http://docs.opencv.org/3.2.0/d1/dfb/
intro.html).
[3] OpenCV, “Installation in linux,” (http://docs.opencv.org/2.4/doc/tutorials/
introduction/linux_install/linux_install.html).
[4] OpenCV, “Using opencv with gcc and cmake,” (http://
docs.opencv.org/2.4/doc/tutorials/introduction/linux_gcc_cmake/
linux_gcc_cmake.html).
[5] OpenCV, “Installation in windows,” (http://docs.opencv.org/2.4/doc/
tutorials/introduction/windows_install/windows_install.html).
[6] OpenCV, “Image filtering,” (http://docs.opencv.org/3.2.0/d4/d86/
group__imgproc__filter.html).
[7] OpenCV, “Making your own linear filters,” (http://docs.opencv.org/
2.4/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.html).
[8] OpenCV, “Basic thresholding operations,” (http://docs.opencv.org
/3.2.0/db/d8e/tutorial_threshold.html).
၈၈
အကးအကားများ ၈၉
[9] OpenCV, “Image thresholding,” (http://docs.opencv.org/3.2.0/d7/d4d/
tutorial_py_thresholding.html).
[10] OpenCV, “adaptivethreshold,” http://docs.opencv.org/3.2.0/d7/d1b/
group__imgproc__misc.html#ga72b913f352e4a1b1b397736707afcde3).
[11] G. B. Garcia, O. D. Suarez, J. L. E. Aranda, J. S. Tercero, I. S. Gracia, and
N. V. Enano, Learning Image Processing with OpenCV. Packt Publish-
ing Ltd., first ed., mar 2015.
[12] Cool-Emerald, “Selective color modification,” http://coolemerald
.blogspot.sg/2014/08/selective-color-modification.html).
[13] OpenCV, “Discrete fourier transform,” (http://docs.opencv.org/
3.1.0/d8/d01/tutorial_discrete_fourier_transform.html).
[14] R. Gonzalez, R. Woods, and S. Eddins, Digital Image Processing Using
MATLAB. Pearson Prentice Hall, 2004.
[15] R. Laganiere, OpenCV Computer Vision Application Programming
Cookbook. Packt Publishing, 2nd ed., 2014.
[16] OpenCV, “Videocapture class reference,” (http://docs.opencv.org/
3.2.0/d8/dfe/classcv_1_1VideoCapture.html).
[17] OpenCV, “Videowriter class reference,” (http://docs.opencv.org/
trunk/dd/d9e/classcv_1_1VideoWriter.html).
[18] OpenCV, “puttext: Draws a text string,” (http://docs.opencv.org/ 3.0-
beta/modules/imgproc/doc/drawing_functions.html#puttext).
[19] OpenCV, “Cascade classifier,” (http://docs.opencv.org/ 2.4/doc/tuto-
rials/objdetect/cascade_classifier/cascade_classifier.html).
၉၀ အကးအကားများ
[20] OpenCV, “Connected component labeling,” (http://docs.opencv.org/
3.2.0/d3/dc0/group__imgproc__shape.html).
[21] OpenCV, “Template matching,” (http://docs.opencv.org/2.4/doc/tut
orials/imgproc/histograms/template_matching/template_matching.html).
[22] OpenCV, “Harris corner detector,” (http://docs.opencv.org/2.4/doc/
tutorials/features2d/trackingmotion/harris_detector/harris_detector.html).