Невозможно определить цвет пикселя в пикселе, который ... меняет цвет - PullRequest
2 голосов
/ 05 января 2010

Я пытаюсь создать приложение, которое, когда цвет пикселя на экране меняется на другой (что я знаю, что это такое), что-то делает, не имеет большого значения для вопроса, что он делает.

В любом случае, я использую это:

 CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
 NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];

Тогда цвет, который я ожидаю, изменится здесь:

NSColor *color = [NSColor colorWithCalibratedRed:0.521569 green:0.380392 blue:0.231373 alpha:1];

И сравниваю цвета здесь:

while (![color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {
 CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
 NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];
 if ([color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {

Я знаю, что часть while / if могла бы быть лучше, но она должна работать просто отлично и не беспокоиться об оптимизации приложения до тех пор, пока оно на самом деле не будет работать.

Теперь, если, например, цвет пикселя на самом деле не меняется быстро (например, цвет остается таким же на некоторое время), он работает отлично. Если он похож на пиксель с цветом, который перемещается и достигает 283 * 420, но не остается там долго (например, 0,1 с) (как описано в примере выше), он не работает.

Время, в течение которого он остается, не должно быть проблемой, так как мое приложение очень быстро проверяет пиксель, как показано в отладке:

2010-01-04 22:12:58.230 appname[2372:a0f] Checked
2010-01-04 22:12:58.231 appname[2372:a0f] Checked

Есть идеи? :)

Ответы [ 2 ]

2 голосов
/ 05 января 2010

Как указывает gs, это не тривиально. Возможно, вы захотите взглянуть на пример Apple CIColorTracking, который использует собственный фильтр Core Image для обнаружения пикселей в движущемся изображении:

http://developer.apple.com/mac/library/samplecode/CIColorTracking/

Здесь немного больше информации о том, как это делается:

http://parmanoir.com/How_Core_Image_Color_Tracking_works

0 голосов
/ 05 января 2010

Возможно, что движущийся объект никогда даже не достигнет этой точки . Ваш монитор имеет частоту обновления около 50 Гц, если один пиксель движется быстрее, чем 50 пикселей / сек , он не будет отображаться на каждом пикселе!

Это также верно для видеобуфера, поскольку все рисунки в Mac OS X имеют двойную буферизацию, обновляемую 50 раз в секунду.

...