Как определить, когда живое изображение DigiScan завершило получение полного кадра с обработчиком событий? - PullRequest
0 голосов
/ 28 августа 2018

Я хочу сделать снимки живого изображения DigiScan.

Однако я хочу сделать это только тогда, когда будет получен полный (или почти полный) кадр!

Прикрепление обработчика событий к живому изображению DigiScan не работает, так как изображение «меняется» с каждой строкой, получаемой последовательно.

Я надеюсь контролировать только последние несколько пикселей живого изображения и захватывать изображение только тогда, когда они меняются. Это возможно?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Этот ответ просто для публикации альтернативной стратегии, упомянутой в комментариях, к ответу с оригинальным примером сценария. Обратите внимание, что следующая измененная версия НЕ РАБОТАЕТ, поскольку попытка зарегистрировать прослушиватель с изменением изображения кажется неудачной (объект слушателя немедленно освобождается).

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())

Вывод этого скрипта выглядит примерно так:

enter image description here

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

0 голосов
/ 28 августа 2018

Ваше предложение именно то, что я и сделал: используя событие 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() ) 
...