Вот что я наблюдал в Mac OS X: после рисования прямоугольника он остается видимым, пока я снова не щелкну мышью внутри окна. Причина этого:
if(g_press) {
temp = cvCloneImage(img);
cvRectangle(temp, cvPoint(rect.x, rect.y), cvPoint(rect.x+rect.width, rect.y+rect.height), CV_RGB(50,50,50));
}
каждый раз, когда происходит щелчок, вы клонируете исходное изображение (чистое / пустое), и это приводит к потере прямоугольника, который был нарисован.
Если это то, что вы ожидали, это работает в моей системе.
EDIT:
Я выполнил более полный анализ вашего кода, и проблема довольно очевидна: все, что вы делаете внутри my_mouse_callback()
, отменяется из-за if
, о котором я упоминал ранее.
Если вы обратите пристальное внимание, вы заметите, что выполнение вашего приложения происходит следующим образом: my_mouse_callback()
вызывается, когда приходит событие мыши, затем оно меняет значение g_press
, конфигурирует структуру rect
с правильные параметры и, наконец, рисует прямоугольник на изображении.
Сразу после этого срабатывает условие if
внутри while
и temp = cvCloneImage(img);
перезаписывает чертеж, созданный с помощью обратного вызова: OOPSIE! А затем вы рисуете другой прямоугольник, который не установлен как CV_FILLED. Другими словами, прямоугольник, который вы видите на окне, вызван:
if(g_press) {
temp = cvCloneImage(img);
cvRectangle(temp, cvPoint(rect.x, rect.y), cvPoint(rect.x+rect.width, rect.y+rect.height), CV_RGB(50,50,50));
}
а не по обратному вызову! Итак, чтобы подвести итог очевидности, если вы хотите, чтобы прямоугольник был заполнен, просто измените этот последний вызов на:
cvRectangle(temp, cvPoint(rect.x, rect.y), cvPoint(rect.x+rect.width, rect.y+rect.height), CV_RGB(50,50,50), CV_FILLED);