#if 0
#include<iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(void) {
VideoCapture cap("./video/test_video.mp4");
//VideoCapture cap;
//cap.open(0);
if (!cap.isOpened()) {
cerr << "Cam open failed!" << endl;
return -1;
}
//cap.set(CAP_PROP_FRAME_WIDTH, 1280);
cap.set(CAP_PROP_FRAME_HEIGHT, 720);
int w = cvRound(cap.get(CAP_PROP_FRAME_WIDTH));
int h = cvRound(cap.get(CAP_PROP_FRAME_HEIGHT));
double fps = cap.get(CAP_PROP_FPS); //fps 0으로 되있네? 영상재생시 fps 가 나타나나, 내 캠으로 영상출력시 fps 0임./
cout << "w x h = "<< w << " x " << h << endl;
cout << "fps: " << fps << endl;
Mat frame, edge;
while (1) { //33 ms 기다림(아래 waitKey 1ms 포함)
cap >> frame;
if (frame.empty()) { // exception process code
cerr << "Frame empty!" << endl;
return -1;
}
imshow("frame", frame);
Canny(frame, edge, 50, 150);
imshow("edge", edge);
if (waitKey(1) == 27)break; // 1ms 입력기다리다가 안오면 다시 루프로.
}
cap.release(); // 자동으로 캠 닫히나, release 사용해서 직접 닫는게 깔끔한 코드형태
destroyAllWindows();
}
#endif
waitKey 인자가 음수일때는 무한히 기다림.
The function waitKey waits for a key event infinitely (when delay≤0 ) or for delay milliseconds, when it is positive.
https://docs.opencv.org/4.x/d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "Video open failed!" << endl;
return -1;
}
double fps = cap.get(CAP_PROP_FPS);
cout << "FPS: " << fps << endl;
double delay = cvRound(1000 / fps);
cout << "delay: " << delay << endl;
Mat frame, inv;
while (1) {
cout << "FPS: " << fps << endl;
cout << "delay: " << delay << endl;
cap >> frame;
if (frame.empty())break;
inv = ~frame;
imshow("frame", frame);
imshow("inv", inv);
Mat rt;
if (waitKey(1) == 27)break;
if (waitKey(1) == 'i' || waitKey(1) == 'I') {
rt = imread("lenna.bmp");
imshow("src", rt);
}
if (!rt.empty()&&waitKey(1) == 'a' || waitKey(1) == 'A') destroyWindow("src");
}
cap.release();
destroyAllWindows();
}
키보드 이벤트 처리 추가
키보드이벤트(레나이미지 불러옴) + 트랙바 추가(레나이미지에서)
결과물:
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void on_level_change(int pos, void* userdata) {
Mat src = *(Mat*)userdata;
Mat dst;
src.copyTo(dst);
dst.setTo(pos * 1);
dst = src + dst;
imshow("lenna", dst);
}
int main()
{
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "Video open failed!" << endl;
return -1;
}
double fps = cap.get(CAP_PROP_FPS);
double delay = cvRound(1000 / fps);
cout << "delay: " << delay << endl;
Mat frame, inv;
Mat rt;
while (1) {
double fps = cap.get(CAP_PROP_FPS);
cout << "FPS: " << fps << endl;
cout << "FPS: " << fps << endl;
cout << "delay: " << delay << endl;
cap >> frame;
if (frame.empty())break;
inv = ~frame;
imshow("frame", frame);
imshow("inv", inv);
if (waitKey(1) == 27)break;
if (waitKey(1) == 'i' || waitKey(1) == 'I') { // 레나이미지 생성
rt = imread("lenna.bmp");
imshow("lenna", rt);
}
if(!rt.empty()&& (waitKey(1) == 't' || waitKey(1) == 'T')) //레나 이미지있는 전제하에, 트랙바 생성
createTrackbar("level", "lenna", 0, 256, on_level_change, (void*) & rt);
if (!rt.empty()&&waitKey(1) == 'a' || waitKey(1) == 'A') destroyWindow("lenna");
//레나 이미지 닫기
}
cap.release();
destroyAllWindows();
}
트랙바 추가하여 설정 시 기존 레나 이미지를 흰색/검정으로 덮어씌우는 현상 이 있었다.
OpenCV Trackbar 주무르기
안녕하세요. 새로운 블로그에 저도 모르게 상쾌한 기분이군요. 오늘은 Tistory 블로그에 이어서, 계속 OpenCV 코드 카테고리 글 작성을 계속하려 합니다. TrackbarOpenCV에는 Trackbar라는 컴포넌트가 존재
devlab.neonkid.xyz
참조하여 산술연산 적용하여 원하는데로 레나영상 이미지를 훼손시키지 않고 명암조절할 수 있었다.
다음 미션) 실시간 영상에 프로그래머스 마크 넣어보기
'프로그래머스 > OPENCV' 카테고리의 다른 글
블러링 (0) | 2022.12.02 |
---|---|
영상의 필터링 - 엠보싱필터링 (0) | 2022.12.02 |
영상의 산술 및 논리연산 (0) | 2022.12.02 |
(4-2) 히스토그램분석 (0) | 2022.12.02 |
(4) 히스토그램분석 (0) | 2022.12.01 |