#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 |