OpenCV์์ KeyEvent๋ฅผ ์ฌ์ฉํด๋ณด์.
OpenCV 3๋ฒ์งธ ํฌ์คํธ์ ๋๋ค. OpenCV ํฌ์คํธ๋ฅผ ์์ด์ง๋ ๊ฝค ์ค๋๋์๋ค์. ^^;
์ด๋ฒ ํฌ์คํธ์์๋ ์์์ KeyEvent๋ฅผ ๋ฃ์ด ํจ๊ณผ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ด๋ฒคํธ๋ฅผ ๋ฃ์ด๋ณด๋ ์ค์ต์ ํ ๋ฒ ํด๋ณด๊ณ ์ ํฉ๋๋ค.
waitKey ํจ์
์ง๋ ํฌ์คํธ๋, ์ฒ์์ ํ๋ ํฌ์คํธ์์๋, ์์์ ๋์ฐ๊ณ , ์ฌ์ฉ์์ ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด, ์ฐ๋ฆฌ๋ ์ฌํ๊น์ง waitKey ํจ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์๋ง ์กฐ๊ธ ๋์น๊ฐ ์์ผ์ ๋ถ๋ค์ด๋ผ๋ฉด, ์์์ ํค๋ณด๋ ์ด๋ฒคํธ๋ฅผ ์ค ๋๋ ์ด ํจ์๋ฅผ ๋ชจํ๋ก ๋๊ฐ ๊ฒ์ด๋ผ๋ ์์ธก์ ํ์ง ์์์๊น ์๊ฐํด๋ณด๋๋ฐ์.
๋ง์ต๋๋ค. waitKey ํจ์์๋ ์ธ์๊ฐ์ผ๋ก int ํํ์ ๊ฐ์ ๋ฃ๊ณ , ๊ทธ ๊ฐ์ ๋ค์ int ํ์ผ๋ก ๋ฐํํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ธ์๋ก ์ฃผ๋ int ํ ๊ฐ์ ๋ฌด์์ด๊ณ , ์ด๋ค ๊ฐ์ ๋๋๋ ค ๋ฐ๋ ๊ฒ์ผ๊น์?
int waitKey(int delay = 0);
waitKey ํจ์์ ํํ๋ ์์ ๊ฐ์ต๋๋ค. ์ธ์ ๊ฐ์ delay ๊ฐ์ผ๋ก, key ์ ๋ ฅ์ ๋ฐ์ ์๊ฐ์ ์ฃผ์ด์ค๋๋ค. ์๋ฌด ์ธ์๊ฐ๋ ๋ฃ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ธ 0์ ๋ถ์ฌํ๊ณ , 0์ ์ธ์๋ก ์ผ์ผ๋ฉด ์ ๋ ฅ ๋ฐ๋ ์๊ฐ์ ๋ฌด๊ธฐํ์ ๋๋ค. ์๊ฐ์ ๋จ์๋ ๋ฐ๋ฆฌ ์ด์ ๋๋ค. (1 Seconds = 1000 mili seconds)
| #include <opencv2/opencv.hpp> | |
| #define IMAGE_PATH "/home/neonkid/Pictures/Chess.jpg" | |
| #define MAIN_WINDOW "WINDOW_NAME" | |
| using namespace std; | |
| using namespace cv; | |
| int main() | |
| { | |
| Mat srcImage = imread(IMAGE_PATH, IMREAD_GRAYSCALE); | |
| if(srcImage.empty()) | |
| { | |
| return -1; | |
| } | |
| imshow(MAIN_WINDOW, srcImage); | |
| waitKey(3000); // 3์ด ํ, ์ฐฝ์ด ์ฌ๋ผ์ง๋๋ค. | |
| return 0; | |
| } |
์์์ ์ฝ๋๋ก ๋ณด๋ฉด, ์์ ๊ฐ์ต๋๋ค. ์ฌํ๊น์ง ์ฐ๋ฆฌ๋ waitKey์ ์ธ์ ๊ฐ์ผ๋ก ์๋ฌด๋ฐ ๊ฐ์ ์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ ๋ฐ๋ ์๊ฐ์๋ ์ ํ์ด ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ , ๋น ์ ธ๋์ค๊ธฐ ์ํด์๋ Esc ํค๋ฅผ ์ฌ์ฉํด์ผ ํ์ง์.
KeyEvent ์์ฉ
๊ทธ๋ผ ์์ ์๋ ๊ฒ์ ํ ๋๋ก, KeyEvent๋ฅผ ์์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ธ์ ๊ฐ์ ํค ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ ์๊ฐ์ด์๋ค๋ฉด, waitKey ํจ์์ ๋ฐํ ๊ฐ์ ์ฌ์ฉ์๊ฐ ๋๋ฅธ ํค ์ด๋ฒคํธ์ ๊ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด, ํค ์ด๋ฒคํธ ๊ฐ์ ๋ฐ์ ํด๋น ์ด๋ฒคํธ ํค ๊ฐ์ ๋ฐ๋ฅธ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๊ฒ ์ฃ ?
๋จผ์ ํค ์ด๋ฒคํธ ๊ฐ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
| #include <opencv2/opencv.hpp> | |
| #define IMAGE_PATH "/home/neonkid/Pictures/Chess.jpg" | |
| #define MAIN_WINDOW "WINDOW_NAME" | |
| using namespace std; | |
| using namespace cv; | |
| int main() | |
| { | |
| Mat srcImage = imread(IMAGE_PATH, IMREAD_GRAYSCALE); | |
| if(srcImage.empty()) | |
| { | |
| return -1; | |
| } | |
| imshow(MAIN_WINDOW, srcImage); | |
| int inKey; | |
| while(1) | |
| { | |
| inKey = waitKey(); | |
| if(inKey == 0) | |
| { | |
| break; | |
| } | |
| cout << hex << inKey << endl; | |
| } | |
| return 0; | |
| } |
ํค ์ด๋ฒคํธ ๊ฐ์ ์์๋ณด๊ธฐ ์ํด, ์ ๋ ๋ฌดํ ๋ฃจํ๋ฌธ์ ์ฌ์ฉํด๋ดค์ต๋๋ค. ์ผ๋จ ์ด๋ค ํค๊ฐ ์ด๋ค ๊ฐ์ธ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์, ์์๋ก 0์ ๋๋ ค๋ฒ๋ ธ์ต๋๋ค(-_-;) ๊ทธ๋ฆฌ๊ณ ์๋ฌด๋ฐ ํค ๊ฐ์ ์ ๋ ฅํด๋ดค์ต๋๋ค.
ํค๋ฅผ ๋ง๊ตฌ์ก์ด๋ก ๋๋ฌ๋ณด๋ ์ซ์๊ฐ ๋ง ๋์ต๋๋ค. ESC ํค๋ฅผ ๋๋ฌ๋ณด๋ 0x10001b ์์ ํ์ธํ ์ ์์์ต๋๋ค. ๊ทธ๋์ ์ ๋ ESC ํค๋ฅผ ๋๋ ์ ๋, ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋๋ก ๊ตฌํํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
| #include <opencv2/opencv.hpp> | |
| #define IMAGE_PATH "/home/neonkid/Pictures/Chess.jpg" | |
| #define MAIN_WINDOW "WINDOW_NAME" | |
| using namespace std; | |
| using namespace cv; | |
| int main() | |
| { | |
| Mat srcImage = imread(IMAGE_PATH, IMREAD_GRAYSCALE); | |
| if(srcImage.empty()) | |
| { | |
| return -1; | |
| } | |
| imshow(MAIN_WINDOW, srcImage); | |
| int inKey; | |
| while(1) | |
| { | |
| inKey = waitKey(); | |
| if(inKey == 0x10001B) | |
| { | |
| break; | |
| } | |
| cout << hex << inKey << endl; | |
| } | |
| return 0; | |
| } |
๊ตฌํ์ ์๊ฐ๋ณด๋ค ๊ฝค ๊ฐ๋จํฉ๋๋ค.
์ด์ ํค๋ณด๋ ์ด๋ฒคํธ์ ๋ํ ๊ฐ๋
์ด ์ถฉ๋ถํ ์ดํด๋์ ๊ฒ์
๋๋ค.
๊ฐ๋จํ ์์ ๋ก, ํค๋ณด๋ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํด, 2์ฑ๋์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ , ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ์๋ก ๊ฒ์ ์์ผ๋ก, ์ผ์ชฝ์ผ๋ก ๊ฐ์๋ก ํฐ์์ผ๋ก ์ญํฌ์ํ๋ ๊ฐ๋จํ ์์์ ์ง๋ณด๊ฒ ์ต๋๋ค.
์ ์์์ ์ธํฌ ์ฌ์ง์ ์ผ๋ถ์
๋๋ค. ๋ณธ๋๋ ์ปฌ๋ฌ ์ด๋ฏธ์ง์ด์ง๋ง,
GRAYSCALE ๋ก๋ ๋ฐฉ์์ ์ฌ์ฉํด 3์ฑ๋์ ์ด๋ฏธ์ง๋ฅผ 2์ฑ๋์ ํ๋ฐฑ ์ด๋ฏธ์ง๋ก ๋ณํํ์์ต๋๋ค.
์ข, ์ฐ ํค๋ณด๋๋ง์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ 2์ฑ๋์ ์ด๋ฏธ์ง๋ก ๋ณํํ์ฌ ์์ฑํด๋ดค์ต๋๋ค.
| #include <opencv2/opencv.hpp> | |
| #define IMAGE_PATH "/home/neonkid/Pictures/cells.jpg" | |
| #define MAIN_WINDOW "WINDOW_NAME" | |
| using namespace std; | |
| using namespace cv; | |
| void onChange(int pos, void *param) | |
| { | |
| Mat *pMat = (Mat *)param; | |
| Mat srcImage = Mat(pMat[0]); | |
| Mat dstImage = Mat(pMat[1]); | |
| int s, r; | |
| int nThreshold = pos; | |
| for(int y = 0; y < srcImage.rows; y++) | |
| { | |
| for(int x = 0; x < srcImage.cols; x++) | |
| { | |
| r = srcImage.at<uchar>(y,x); | |
| if(r > nThreshold) | |
| { | |
| s = 255; | |
| } | |
| else | |
| { | |
| s = 0; | |
| } | |
| dstImage.at<uchar>(y,x) = s; | |
| } | |
| } | |
| imshow(MAIN_WINDOW, dstImage); | |
| } | |
| int main() | |
| { | |
| Mat images[2]; | |
| images[0] = imread(IMAGE_PATH, IMREAD_GRAYSCALE); | |
| if(images[0].empty()) | |
| { | |
| return -1; | |
| } | |
| images[1].create(images[0].size(), CV_8U); | |
| imshow(MAIN_WINDOW, images[0]); | |
| int inKey; | |
| int pos = 128; | |
| onChange(pos, (void*)images); | |
| while(1) | |
| { | |
| inKey = waitKey(); | |
| if(inKey == 0x10001B) // Press ESC Key.... | |
| { | |
| break; | |
| } | |
| switch(inKey) | |
| { | |
| case 0x10FF53: // Press Left Key.... | |
| pos += 10; | |
| onChange(pos, (void*)&images); | |
| break; | |
| case 0x10FF51: // Press Right Key.... | |
| pos -= 10; | |
| onChange(pos, (void*)&images); | |
| break; | |
| } | |
| } | |
| return 0; | |
| } |
ํน์ฑ์ 255์ ์ซ์๋ฅผ ๋์ง ์๋๋ก ํ์์ต๋๋ค. 255๋ฅผ ๋๊ธธ ๊ฒฝ์ฐ, ์ฐจํ์ ๋๋ฌด ์ค๋ฅธ์ชฝ์ผ๋ก ๋๊ฒจ๋ ๋ค์ ์ผ์ชฝ์ผ๋ก ๋์๊ฐ๊ธฐ๊ฐ ๋งค์ฐ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์น๋ฉฐ...
๋ง์ฐ์ค ์ด๋ฒคํธ์ ์ด์ด์ ํค๋ณด๋ ์ด๋ฒคํธ์ ๋ํ ๊ฐ๋จํ ๋ด์ฉ์ด์์ต๋๋ค.
๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ ๋๋ ์ด๋ค ํน์ ํ ์์ญ์ ์ฌ์ฉํ์ฌ ์์์ ๋ฐ๊ฟจ๊ธฐ ๋๋ฌธ์, ์ด๋ป๊ฒ ๋ณด๋ฉด ์ฌ์ธ์๋, ์ด๋ ค์ธ ์๋ ์์์ต๋๋ค๋ง ํค๋ณด๋ ์ด๋ฒคํธ๋ ์ด๋ค ์์ญ์ ๋ฐ๊พธ๋ ๊ฒ์ด ์๋ ์์ ์ ์ฒด ์์ญ์ ๋ฐ๊พธ๋ ๋ฐ ๊ธฐ์ธ์ด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๊ณ ํด์, ํน์ ์์ญ์ ๋ณ๊ฒฝํ ๋, ํค๋ณด๋๋ฅผ ์ฐ์ง ๋ชปํ๋ ๊ฒ์ ์๋๋๋ค. ํค๋ณด๋์ ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ๋ณํํ๋ค๋ฉด, ๋ง์ฐ์ค๋ก ์ํ๋ ์์ญ์ ์ก๊ณ , ๊ทธ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋๋ค๊ฐ, ํค๋ณด๋๋ก ๊ทธ ๊ฐ์ ์์ ๋ก์ด ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ต๋๋ค.
'Programming > OpenCV' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [OpenCV] C++์ OpenCV 4.x๋ก ๊ฐ๋ฐํ ์ ์๋ ํ๊ฒฝ ๋ง๋ค๊ธฐ (0) | 2022.07.02 |
|---|---|
| [GP] OpenCV Trackbar ์ฃผ๋ฌด๋ฅด๊ธฐ (0) | 2017.03.01 |
| OpenCV์์ Mouse Event๋ฅผ ์ฌ์ฉํด๋ณด์ (0) | 2016.12.18 |
| OpenCV์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฐฉ๋ฒ๊ณผ Mat ํด๋์ค (0) | 2016.11.20 |
| Ubuntu 16.04 ์์ OpenCV 3.x ์ค์น (0) | 2016.11.06 |
