This commit is contained in:
yumoqing 2021-02-01 23:07:58 +08:00
parent 743c6290f0
commit b7febb6567
8 changed files with 33486 additions and 1 deletions

View File

@ -366,10 +366,19 @@ class Blocks(EventDispatcher):
w.bind(**{event:f})
# Logger.info('Block: %s bind built', str(desc))
def multipleAction(self, widget, desc, *args):
mydesc = {
'wid':desc['wid'],
'event':desc['event']
}
for a in desc['actions']:
new_desc = mydesc.copy()
new_desc.update(a)
self.unication(widget,new_desc, **args)
def uniaction(self,widget,desc, *args):
Logger.info('Block: uniaction() called, desc=%s', str(desc))
acttype = desc.get('actiontype')
if acttype=='blocks':
return self.blocksAction(widget,desc, *args)
@ -381,8 +390,30 @@ class Blocks(EventDispatcher):
return self.scriptAction(widget, desc, *args)
if acttype == 'method':
return self.methodAction(widget, desc, *args)
if acttype == 'event':
return self.eventAction(widget, desc, *args)
if acttype == 'multiple':
return self.MultipleAction(widget, desc, *args)
alert("actiontype(%s) invalid" % acttype,title='error')
def eventAction(self, widget, desc, *args):
target = Blocks.getWidgetById(desc.get('target','self'),widget)
event = desc.get('dispatch_event')
if not event:
Logger.info('Block: eventAction():desc(%s) miss dispatch_event',
str(desc))
return
params = desc.get('params',{})
d = self.getActionData(widget,desc)
if d:
params.update(d)
try:
target.dispatch(event, **params)
except Exception as e:
Logger.info(f'Block: eventAction():dispatch {event} error')
return
def blocksAction(self,widget,desc, *args):
target = Blocks.getWidgetById(desc.get('target','self'),widget)
if target is None:

View File

@ -0,0 +1,87 @@
from kivy.uix.camera import Camera
from kivy.properties import BooleanProperty, NumericProperty
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
import kivy
import numpy as np
import cv2
from kivy.base import Builder
from .image_processing.image_processing import face_detection
btxt = """<CustomCamera>:
resolution: (1920,1050)
play: True
keep_ratio: True
allow_stretch: True
canvas.before:
PushMatrix
Rotate:
angle: root.angle
axis: 0, 0, 1
origin: root.center
canvas.after:
PopMatrix
"""
class CustomCamera(Camera):
detectFaces = BooleanProperty(False)
angle = NumericProperty(0)
def __init__(self, **kwargs):
super(CustomCamera, self).__init__(**kwargs)
self.isAndroid = kivy.platform == "android"
if self.isAndroid:
self.angle = -90
def change_index(self, *args):
new_index = 1 if self.index == 0 else 0
self._camera._set_index(new_index)
self.index = new_index
self.angle = -90 if self.index == 0 else 90
def on_tex(self, *l):
image = np.frombuffer(self.texture.pixels, dtype='uint8')
image = image.reshape(self.texture.height, self.texture.width, -1)
image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
if self.detectFaces:
image, faceRect = face_detection(image, (0, 255, 0, 255), self.angle)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGBA)
numpy_data = image.tostring()
self.texture.blit_buffer(numpy_data, bufferfmt="ubyte", colorfmt='rgba')
super(CustomCamera, self).on_tex(self.texture)
def get_cameras_count(self):
cameras = 1
if self.isAndroid:
cameras = self._camera.get_camera_count()
return cameras
class QrReader(Camera):
def __init__(self, **kw):
super(QrReader, self).__init__(**kw)
self.qr_reader = cv2.QRCodeDetector()
self.register_event_type('on_data')
self.qr_result = None
def getValue(self):
return {
"qr_result":self.qr_result
}
def on_data(self, d):
print('data=',d)
def on_tex(self, *l):
image = np.frombuffer(self.texture.pixels, dtype='uint8')
image = image.reshape(self.texture.height, self.texture.width, -1)
image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
self.qr_result, bbox,_ = self.qr_reader.detectAndDecode(image)
if self.qr_result:
print('qr read done')
self.dispatch('on_data',self.qr_result)
super(QrReader, self).on_tex(self.texture)
Builder.load_string(btxt)

View File

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,50 @@
import cv2
# import imutils
import numpy as np
def simple_return(image):
return image
def crop_image(image):
return image[0:350, 0:350]
detector = cv2.CascadeClassifier('image_processing/cascades/haarcascade_frontalface_default.xml')
def face_detection(image, rect_color, rotation):
if rotation == 90:
image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
if rotation == -90:
image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
orig_image = image.copy()
height, width = orig_image.shape[:2]
new_width = 300
r = new_width / float(width)
dim = (new_width, int(height * r))
ratio = (width / dim[0], height / dim[1])
image = cv2.resize(image, dim)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faceRects = detector.detectMultiScale(image, scaleFactor=1.2, minNeighbors=5,
minSize=(20, 20), flags=cv2.CASCADE_SCALE_IMAGE)
for (x, y, w, h) in faceRects:
x = int(x * ratio[0])
y = int(y * ratio[1])
w = x + int(w * ratio[0])
h = y + int(h * ratio[1])
cv2.rectangle(orig_image, (x, y), (w, h), rect_color, 2)
if rotation == 90:
orig_image = cv2.rotate(orig_image, cv2.ROTATE_90_CLOCKWISE)
if rotation == -90:
orig_image = cv2.rotate(orig_image, cv2.ROTATE_90_COUNTERCLOCKWISE)
return orig_image, faceRects

View File

@ -23,8 +23,11 @@ from .chart2d import Chart2d
from .message import Conform
from .pagepanel import PagePanel
from .markdown import Markdown
from .custom_camera import CustomCamera, QrReader
r = Factory.register
r('CustomCamera', CustomCamera)
r('QrReader', QrReader)
r('Markdown', Markdown)
r('PagePanel', PagePanel)
r('Conform', Conform)