#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 delay0 ) 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();
}

 

 

트랙바 추가하여 설정 시 기존 레나 이미지를 흰색/검정으로 덮어씌우는 현상 이 있었다.

이에 https://devlab.neonkid.xyz/2017/03/01/opencv/2017-03-01-OpenCV-trackbar-%EC%A3%BC%EB%AC%B4%EB%A5%B4%EA%B8%B0/

 

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

+ Recent posts