파랑 색을 감지하는 프로그램을 만들고 화면의 좌표에 따라 마우스를 움직이거나 클릭합니다.시스템 명령을 사용하는 동안 SendInput이 작동하지 않습니다.
감지가 제대로 작동하지만 "system ("osk ")"줄의 가상 키보드를 추가 할 때 문제가 발생했습니다.
활성 창이 가상 키보드 인 경우 프로그램이 백그라운드에서 작동하지 않습니다. 프로그램이 실행 중이지만 마우스가 움직이거나 클릭하지 않는 것입니다. 활성 창이 가상 키보드가 아닐 때 모든 것이 올바르게 작동합니다.
내 코드에서 무엇이 잘못되었는지 알 수 있도록 도와 줄 수 있습니까?
이
마우스 이동 코드 :void MouseMove(int x, int y)
{
double fScreenWidth = ::GetSystemMetrics(SM_CXSCREEN) - 1;
double fScreenHeight = ::GetSystemMetrics(SM_CYSCREEN) - 1;
double fx = 2 * x*(65535.0f/(fScreenWidth - 200));
double fy = 2 * y*(65535.0f/fScreenHeight);
INPUT Input = { 0 };
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
Input.mi.dx = (LONG)fx;
Input.mi.dy = (LONG)fy;
::SendInput(1, &Input, sizeof(INPUT));
}
을 그리고 이것은 명령 시스템 ("OSK")가있는 주요 기능입니다 :
int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
return -1;
system("osk"); // <-----------------------------------------
while (true)
{
int xMouse = 0, yMouse = 0;
float totalX = 0.0, totalY = 0.0;
Mat frame, frame2;
cap >> frame;
cvtColor(frame, frame2, COLOR_BGR2HSV);
Mat hsvImg = frame2;
inRange(hsvImg, Scalar(78, 241, 59), Scalar(255, 255, 255), hsvImg); // Blue
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
erode(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
dilate(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
dilate(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
erode(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
Mat drawing = Mat::zeros(frame.size(), CV_8UC3);
flip(drawing, drawing, 1);
flip(frame, frame, 1);
flip(hsvImg, hsvImg, 1);
RNG rng(12345);
findContours(hsvImg, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
if (contours.size() > 0)
{
float sumX = 0.0, sumY = 0.0;
for (unsigned int i = 0; i < contours.size(); i++)
{
for (unsigned int j = 0; j < contours[i].size(); j++)
{
totalX += contours[i][j].x;
sumX++;
totalY += contours[i][j].y;
sumY++;
}
}
if (contours.size() == 2)
{
LeftClick();
cout << contours.size() << endl << endl;
}
else if (contours.size() == 1)
{
xMouse = (int)(totalX/sumX);
yMouse = (int)(totalY/sumY);
MouseMove(xMouse, yMouse);
}
else{
cout << "Too many Contours" << endl << endl;
}
for (unsigned int i = 0; i < contours.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point2f(xMouse, yMouse));
}
}
imshow("Drawing", drawing);
imshow("Original", frame);
if (waitKey(30) == 'q') //Wait 30 milisec. If user pressed ‘q’ break the loop.
break;
}
waitKey(0);
}
감사합니다 :)