반응형

 

 

웹캠 영상에 실시간으로 ROI 하는 예제입니다. 

 

 

 

 

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


bool mouse_is_pressing = false;
int start_x, start_y, end_x, end_y;
int step = 0;
Mat img_color;


void swap(int* v1, int* v2) {
	int temp = *v1;
	*v1 = *v2;
	*v2 = temp;
}


void mouse_callback(int event, int x, int y, int flags, void* userdata)
{
	Mat img_result = img_color.clone();


	if (event == EVENT_LBUTTONDOWN) {
		step = 1;

		mouse_is_pressing = true;
		start_x = x;
		start_y = y;



	}
	else if (event == EVENT_MOUSEMOVE) {

		if (mouse_is_pressing) {

			end_x = x;
			end_y = y;

			step = 2;
		}

	}
	else if (event == EVENT_LBUTTONUP) {

		mouse_is_pressing = false;

		end_x = x;
		end_y = y;
		
		step = 3;
	}
}



int main()
{

	//비디오 캡쳐 초기화
	VideoCapture cap(0);
	if (!cap.isOpened()) {
		cerr << "에러 - 카메라를 열 수 없습니다.\n";
		return -1;
	}
	
	namedWindow("Color", 1);
	setMouseCallback("Color", mouse_callback);


	while (1)
	{

		cap.read(img_color);
		if (img_color.empty()) {
			cerr << "빈 영상이 캡쳐되었습니다.\n";
			break;
		}

		switch (step)
		{

			case 1:
				circle(img_color, Point(start_x, start_y), 10, Scalar(0, 255, 0), -1);
				break;

			case 2:
				rectangle(img_color, Point(start_x, start_y), Point(end_x, end_y), Scalar(0, 255, 0), 3);
				break;

			case 3:

				if (start_x > end_x) {
					swap(&start_x, &end_x);
					swap(&start_y, &end_y);
				}


				Mat ROI(img_color, Rect(start_x, start_y, end_x - start_x, end_y - start_y));
				cvtColor(ROI, ROI, COLOR_BGR2GRAY);
				Canny(ROI, ROI, 150, 50);
				cvtColor(ROI, ROI, COLOR_GRAY2BGR);

				ROI.copyTo(img_color(Rect(start_x, start_y, end_x - start_x, end_y - start_y)));
				break;

		}


		imshow("Color", img_color);


		if (waitKey(25) >= 0)
			break;
	}


	destroyAllWindows();

	return 0;
}
반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 렉스 2019.07.03 17:55

    if (waitKey(1) == 32) {
    waitKey(0);
    }
    if (waitKey(1) == 27) {
    break;
    }
    의 코드를 써서 일시정지와 종료를 만들고 싶었는데 잘 안되네요 어떻게 해야하나요?
    작동은 되는데 esc는 잘 안되고
    코드 순서를 바꾸면 space키가 잘 안되서요

    else if는 안됬어요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.03 23:58 신고

      다음처럼 하면 될듯합니다.


      int key = waitKey(1);

      if (key == 32) {
      waitKey(0);
      }
      else if (key == 27) {
      break;
      }

  2. 리바이스 2019.07.04 13:28

    관심영역은 원이나 평행사변형으로는 못만드나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.04 13:35 신고

      ROI는 사각형만 가능합니다.

      하지만...
      마스크 이미지로 원하는 도형을 사용한다면 (검은색 바탕에 흰색 도형) and 연산으로 원하는 도형 모양의 이미지를 얻을 수 있긴합니다.

  3. cross 2019.07.04 17:13

    물체와 카메라 사이의 거리를 계산하고 싶은면 어떻게 해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.04 17:21 신고

      다음 링크를 참고해보세요.

      https://www.pyimagesearch.com/2015/01/19/find-distance-camera-objectmarker-using-python-opencv/

  4. cross 2019.07.04 17:29

    파이선으로 쓰는곳을 알려주셨는데 c++용은 따로 나온데 없나요?

  5. 라이칸 2019.07.05 17:11

    우분투에서 이걸 하고 잘못했는지 영상을 못 가져오네요
    할 수 있는 방법 알수 있을까요?
    #include "opencv2/opencv.hpp "
    이게 오류라는데 opencv 적용 어떻게 시키나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.05 17:32 신고

      다음 링크 5.1번을 확인해보세요

      https://webnautes.tistory.com/1186

  6. 제로 2019.07.11 11:58

    c++로 관심영역 안에서의 특정 물체를 찾거나 카메라간의 거리 측정을 해보고 싶은데
    어떻게 관심영역 안에 처리할수 있나요?
    참고할수 있는 사이트나 블로그 있나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.11 12:27 신고

      opencv ROI를 검색해보세요.

      원본 이미지에서 ROI를 얻어서 OpenCV 함수의 입력으로 사용하면 될듯합니다.

      처리 결과는 ROI한 위치에 다시 보여주면.됩니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.11 12:40 신고

      다음 포스트도 검토해보세요.

      https://webnautes.tistory.com/1353

  7. 포스팅 잘보고 있습니다 2020.07.28 11:52

    혹시 python 으로 된 버전은 없는지 궁금합니다
    실시간으로 roi해서 위 동영상 처럼 흑백에 선으로 나타내는 것을 하고 싶습니다


    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.07.28 20:09 신고

      영상에서 ROI하는 파이썬 버전은 블로그에 없습니다.

      다음 포스트에서 이미지에 대한 ROI를 C++과 Python으로 설명하고 있습니다.
      참고하셔서 지금 포스트의 코드를 수정해보세요.

+ Recent posts