import os, sys
import cvb
if sys.version_info >= (3, 11):
from PySide6 import QtCore
from PySide6.QtCore import QObject, Qt, QUrl, Property, Signal, Slot
else:
from PySide2 import QtCore
from PySide2.QtCore import QObject, Qt, QUrl, Property, Signal, Slot
from result_model import ResultModel, PolimagoResult
GRID_STEP = 0.6
THRESHOLD = 0.0
LOCALITY = 1.0
class Classification(QtCore.QObject):
def __init__(self, device, result_model):
super().__init__()
self._device = device
self._stream = device.stream()
self._model = result_model
self._source = ""
self._search_predictor = ""
self._classification_predictor = ""
self.notify_source.connect(self.source_changed)
self.notify_search_predictor.connect(self.search_predictor_changed)
self.notify_classification_predictor.connect(self.classification_predictor_changed)
@Slot()
def snap(self):
self._model.update([None] * 0)
self._image, wait_status = self._stream.get_timed_snapshot(1000)
if (wait_status != cvb.WaitStatus.Ok):
return None
self._model.refresh(self._image)
@Slot()
def classify(self):
if self._search == 0 or self._classification == 0:
sys.stderr.write('No search predictor or classification predictor was loaded.\n')
return None
search_res, calls = self._search.grid_search(self._image, self._image.bounds, GRID_STEP, THRESHOLD, LOCALITY)
polimago_results = [None] * 0
for res in search_res:
if res.quality >= 0.3:
clf_res, confidence_distribution = self._classification.classify(self._image, pos)
polimago_results.append(PolimagoResult(pos, res.quality, clf_res))
self._model.update(polimago_results)
def source(self):
return self._source
def set_source(self, imageSource):
self._source = imageSource
self.notify_source.emit()
def search_predictor(self):
return self._search_predictor
def set_search_predictor(self, searchPredictor):
self._search_predictor = searchPredictor
self.notify_search_predictor.emit()
def classification_predictor(self):
return self._classification_predictor
def set_classification_predictor(self, classificationPredictor):
self._classification_predictor = classificationPredictor
self.notify_classification_predictor.emit()
@Signal
def notify_source(self):
pass
@Signal
def notify_search_predictor(self):
pass
@Signal
def notify_classification_predictor(self):
pass
@Slot()
def source_changed(self):
self._model.update([])
self._search = 0
self._classification = 0
self._device.close()
path = self._source.toLocalFile()
if path.endswith(".vin"):
path, cvb.AcquisitionStack.Vin)
self._stream = self._device.stream()
self.snap()
elif path.endswith(".bmp"):
self._model.refresh(self._image)
@Slot()
def search_predictor_changed(self):
if not self.search_predictor().isEmpty():
@Slot()
def classification_predictor_changed(self):
if not self.classification_predictor().isEmpty():
imageSource = Property(QUrl, source, set_source)
searchPredictor = Property(QUrl, search_predictor, set_search_predictor)
classificationPredictor = Property(QUrl, classification_predictor, set_classification_predictor)
Union[cvb.GenICamDevice, cvb.VinDevice, cvb.EmuDevice, cvb.VideoDevice, cvb.NonStreamingDevice] open(str provider, int acquisition_stack=cvb.AcquisitionStack.PreferVin)