Как определить, когда живое изображение DigiScan завершило получение полного кадра с обработчиком событий?
Я хочу сделать снимки живого изображения DigiScan.
Однако я хочу сделать это только тогда, когда будет получен полный (или почти полный) кадр!
Прикрепление обработчика событий к живому изображению DigiScan не работает, так как изображение "меняется" с каждой строкой, получаемой последовательно.
Я надеюсь контролировать только последние несколько пикселей живого изображения и захватывать изображение только тогда, когда они меняются. Это возможно?
2 ответа
Ваше предложение именно то, что я и сделал: используя событие data_changed в качестве триггера, и в методе обработки событий проверьте значение последнего пикселя изображения, если оно изменилось. (Начальное значение первого прохода гарантированно равно нулю. С этого момента сохраняйте значение чека.)
Итак, по сути, вы ответили на свой вопрос - что остается неясным?
Вы можете проверить один пиксель, используя GetPixel()
команда или img[x,y]
нотации.
пример
class CFrameCompleteListen
{
number lastPixelValue
number listenID
number frameCount, sx, sy
void OnDataChanged( object self, number flags, image img )
{
number value = img.GetPixel( sx-1,sy-1)
if ( value == lastPixelValue )
return
frameCount++
lastPixelValue = value
Result( "\n Image [" + img.GetLabel() + "] frame #"+ frameCount + " complete." )
if ( 3 <= frameCount )
{
ImageRemoveEventListener( img, listenID )
Result("\n Listening stopped." )
}
}
object Launch( object self, image img )
{
lastPixelValue = 0
frameCount = 0
sx = img.ImageGetDimensionSize(0)
sy = img.ImageGetDimensionSize(1)
listenID = ImageAddEventListener( img, self, "data_changed:OnDataChanged" )
Result("\n Listening started." )
return self
}
}
Alloc( CFrameCompleteListen ).Launch( GetFrontImage() )
Этот ответ заключается просто в публикации альтернативной стратегии, упомянутой в комментариях, к ответу с оригинальным примером сценария. Обратите внимание, что следующая измененная версия НЕ РАБОТАЕТ, поскольку попытка зарегистрировать прослушиватель с изменением изображения кажется неудачной (объект слушателя немедленно освобождается).
class CFrameCompleteListen2
{
number lastPixelValue
number listenID
number frameCount
void OnDataChanged( object self, number flags, image img )
{
Result("\n Change event." )
number value = img.GetPixel( 0, 0 )
if ( value == lastPixelValue )
return
frameCount++
lastPixelValue = value
Result( "\n Image [" + img.GetLabel() + "] frame #"+ frameCount + " complete." )
if ( 3 <= frameCount )
{
ImageRemoveEventListener( img, listenID )
Result("\n Listening stopped." )
}
}
object Launch( object self, image img )
{
lastPixelValue = img.GetPixel( 0, 0 )
frameCount = 0
listenID = ImageAddEventListener( img, self, "data_changed:OnDataChanged" )
Result("\n Listening started." )
return self
}
~CFrameCompleteListen2( object self )
{
Result( "\n Listener released.\n" )
}
}
void main()
{
image targetImage := GetFrontImage()
number targetW = targetImage.ImageGetDimensionSize(0)
number targetH = targetImage.ImageGetDimensionSize(1)
image lastPixelImage := targetImage[targetH - 1, targetW - 1, targetH, targetW]
lastPixelImage.ShowImage()
object listener = Alloc( CFrameCompleteListen2 ).Launch( lastPixelImage )
}
main()
Редактировать: BmyGuest (см. Комментарии):
Следующий скрипт показывает, что при отображении "нарезанной" памяти создается новое изображение с новой ссылкой:
ClearResults()
image newFull := RealImage("Full",4,100,100)
Result("\n Image label 'full':" + newFull.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
newFull.ShowImage()
Result("\n Image label 'full':" + newFull.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
image getFull := GetFrontImage()
Result("\n Image label 'full' (front):" + getFull.ImageGetLabel() + " | ID:" + getFull.ImageGetID())
image slice := newFull[0,0,2,2]
Result("\n Image label 'slice':" + slice.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
slice.ShowImage()
Result("\n Image label 'slice':" + slice.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
image getSlice := GetFrontImage()
Result("\n Image label 'slice' (front):" + getSlice.ImageGetLabel() + " | ID:" + getSlice.ImageGetID())
Вывод этого скрипта выглядит примерно так:
Следовательно, вышеприведенный скрипт слушателя завершается сбоем и отменяет регистрацию слушателя, потому что lastPixelImage не ссылается на показанное 1-пиксельное изображение и, следовательно, сразу выходит из области видимости (удаляя слушателя в процессе). Сценарий действительно работает, если взять отображаемое изображение после его показа и использовать его в качестве справочного. Соответственно, скрипт также будет работать, если переменная нарезанного изображения будет находиться в области видимости.