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

using namespace std;
using namespace cv;

void on_level_change(int pos, void* userdata) {
	Mat img = *(Mat*)userdata;

	img.setTo(pos * 16);
	imshow("img", img);
}

int main(void) {
	Mat img = Mat::zeros(400, 400, CV_8UC1);
	namedWindow("img");
	int p = 0;
	createTrackbar("level", "img", &p, 16, on_level_change, (void*)&img);

	imshow("img", img);
	waitKey();
}

#1

#include<iostream>
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;

void on_mouse(int event, int x, int y, int flags, void*) {
	switch (event) {
	//case  EVENT_LBUTTONUP :
	//    if(flags == EVENT_MOUSEMOVE)
	//		cout << "EVENT_MOUSEMOVE:  " << x << ", " << y << endl;
		//default: break;
	case EVENT_MOUSEMOVE:
		//case1
		/*if (flags == EVENT_FLAG_LBUTTON)  //  &연산으로 해당 flags에 비트가 설정됬는지 확인하는게 == 하는것보다 적절한 방식임
			cout << "EVENT_MOUSEMOVE:   " << x << ", " << y << endl;*/
		//== 사용 시 ctrl누른 상태에서 마우스 좌측 버튼 클릭시 출력물결과 안나옴. 1비트아닌 ctrl버튼 합쳐 9비트가 되기에
		
		//case2
		if (flags & EVENT_FLAG_LBUTTON)  //  비트단위 논리 연산 &으로 해당 flags에 비트가 설정됬는지 확인하는게 == 하는것보다 적절한 방식임
			cout << "EVENT_MOUSEMOVE2:   " << x << ", " << y << endl;
	default:
		break;
	}
}

int main(void) {
	Mat src = imread("lenna.bmp");
	namedWindow("src");
	setMouseCallback("src", on_mouse);
	imshow("src", src);
	waitKey();
}

 

 

#2 마우스 빨리 움직일 시 띄엄띄엄 그려짐

#include<iostream>
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;

// 그림 그릴려면 on_mouse에 Mat 클래스 넣을 인자가 없기에 전역으로 선언.

//문제는 마우스를 빨리 움직일 시 띄엄띄엄 그려짐.
// 이에 한점을 클릭 후 다른 한점 을 클릭하여 2개의 점을 통해 즉 oldPoint와 nowPoint 간 거리를 잇는 직선을 만들어 그릴 거임. 
//main3_drawing.cpp 에서 다룰 거임.
Mat src;
void on_mouse(int event, int x, int y, int flags, void*) {
	switch (event) {
	case EVENT_MBUTTONDOWN:
		cout << "EVENT_MBUTTONDOWN: " << x << ", " << y << endl;
	case EVENT_MOUSEMOVE:
	
		if (flags & EVENT_FLAG_LBUTTON) {  //  비트단위 논리 연산 &으로 해당 flags에 비트가 설정됬는지 확인하는게 == 하는것보다 적절한 방식임
			cout << "EVENT_MOUSEMOVE2:   " << x << ", " << y << endl;
			circle(src, Point(x, y), 2, Scalar(0, 255, 255), -1, LINE_AA);
			imshow("src", src);
		}
	default:
		break;
	}
}

int main(void) {
	src = imread("lenna.bmp");
	namedWindow("src");
	setMouseCallback("src", on_mouse);
	imshow("src", src);
	waitKey();
}

 

 

#3  이전 Point를 저장해서 현재 Point 와 함께 Line 함수를 통해 직선을 그려 마우스 좌측 클릭을 계속 누를 시 #2에서 나온 띄엄띄엄그려지는 게 아닌 연이어 그려지게 한다.

 

#include<iostream>
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;

Mat src;
Point ptOld;
void on_mouse(int event, int x, int y, int flags, void*) {
	switch (event) {
	case EVENT_MBUTTONDOWN:
		ptOld = Point(x, y);
		cout << "EVENT_MBUTTONDOWN: " << x << ", " << y << endl;
	case EVENT_MOUSEMOVE:

		if (flags & EVENT_FLAG_LBUTTON) {  //  비트단위 논리 연산 &으로 해당 flags에 비트가 설정됬는지 확인하는게 == 하는것보다 적절한 방식임
			cout << "EVENT_MOUSEMOVE2:   " << x << ", " << y << endl;
			/*circle(src, Point(x, y), 2, Scalar(0, 255, 255), -1, LINE_AA);*/
			line(src, ptOld, Point(x, y), Scalar(0, 255, 255), 3, LINE_AA);
			ptOld = Point(x, y);
			imshow("src", src);
		}
	default:
		break;
	}
}

int main(void) {
	src = imread("lenna.bmp");
	namedWindow("src");
	setMouseCallback("src", on_mouse);
	imshow("src", src);
	waitKey();
}

 

#4 트랙바  ( src 전역변수 사용안코 pointer 활용해 함수에서 src 사용)

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

using namespace std;
using namespace cv;

void on_level_change(int pos, void* userdata) { // userdata로 img가 전달됨  
	Mat img = *(Mat*)userdata;  // void*형식을 Mat*으로 변환 후 다시 *를 이용해 img데이터를 참조 하여 Main의 img와 동일해짐

	img.setTo(pos * 16);  // pos값이 0으로 설정될 시 img 모든 픽셀이 0으로 바뀌고 16으로 설정시 16*16인 256이 아닌 gray scale의 최댓값 255로 바뀐다.
	imshow("img", img);
}

int main(void) {
	Mat img = Mat::zeros(400, 400, CV_8UC1);
	namedWindow("img");
	int p = 0;
	createTrackbar("level", "img", &p, 16, on_level_change, (void*)&img);  // img 주소값 void*형식으로 전달
	//0~16 까지 트랙바 위치 설정


	imshow("img", img);
	waitKey();
}

함수 내 img와 main 에서의 img가 동일해짐.

'프로그래머스 > OPENCV' 카테고리의 다른 글

영상의 명암비 조절  (0) 2022.12.01
영상의 밝기조절(2)  (3) 2022.12.01
영상의 밝기 조절(1)  (0) 2022.12.01
2-5 유용한 OpenCV 기능  (0) 2022.12.01
2-4 유용한 OpenCV 함수  (0) 2022.12.01

+ Recent posts