SOL4Py Sample: ObjectDetectorByCacadeClassifier
|
#******************************************************************************
#
# Copyright (c) 2018-2019 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#******************************************************************************
# ObjectDetectorByCacadeClassifier.py
# encodig: utf-8
import sys
import os
import cv2
import traceback
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
#
sys.path.append('../')
from SOL4Py.ZApplicationView import *
from SOL4Py.ZLabeledComboBox import ZLabeledComboBox
from SOL4Py.ZLabeledSlider import ZLabeledSlider
from SOL4Py.opencv.ZOpenCVImageView import ZOpenCVImageView
from SOL4Py.ZVerticalPane import ZVerticalPane
from SOL4Py.ZLabeledFileComboBox import ZLabeledFileComboBox
class MainView(ZApplicationView):
# Inner classes
#--------------------------------------------
class SourceImageView(ZOpenCVImageView):
def __init__(self, parent):
ZOpenCVImageView.__init__(self, parent)
def load(self, filename):
self.load_opencv_image(filename)
self.update()
def detect(self, xml_classifier):
image = self.get_opencv_image()
try:
cascade_classifier = cv2.CascadeClassifier()
cascade_classifier.load(xml_classifier);
faces = cascade_classifier.detectMultiScale(image, 1.3, 4) #scaleFactor=1.1, minNeighbors=1, minSize=(20,20))
print
if len(faces) == 0:
QMessageBox.information(self, "ObjectDector",
"Not found objects by CascadeClassifier. detectMultiScale")
else:
for face in faces:
x, y, w, h = face
print("{} {} {} {}".format(x, y, w, h))
cv2.rectangle(image, (x, y),
(x + w, y + h),
(0, 200, 0), 3) ##, CV_AA);
self.set_opencv_image(image)
self.update()
except:
traceback.print_exc()
#--------------------------------------------
# MainView Constructor
def __init__(self, title, x, y, width, height):
super(MainView, self).__init__(title, x, y, width, height)
self.filename = "../images/WafukuGirl.png"
# 1 Create first imageview.
self.source_image_view = self.SourceImageView(self)
# 3 Load the file
self.load_file(self.filename)
# 4 Add two image views to a main_layout of this main view.
self.add(self.source_image_view)
# 5 Add a labeled file combobox to top dock area
self.add_classifier_combobox()
self.show()
# Add control pane to MainView
def add_control_pane(self, fixed_width=200):
# Control pane widget
self.vpane = ZVerticalPane(self, fixed_width)
self.reload_button = QPushButton("Reload", self.vpane)
self.reload_button.clicked.connect(self.reload_button_clicked)
self.vpane.add(self.reload_button)
self.detect_button = QPushButton("Detect", self.vpane, )
self.detect_button.clicked.connect(self.detect_button_clicked)
self.vpane.add(self.detect_button)
self.set_right_dock(self.vpane)
def add_classifier_combobox(self):
self.classifier_combobox = ZLabeledFileComboBox(self, "Classfier")
self.classifier_combobox.listup_files("C:/opencv/build/etc/haarcascades/*.xml")
self.set_top_dock(self.classifier_combobox)
# Show FileOpenDialog and select an image file.
def file_open(self):
options = QFileDialog.Options()
filename, _ = QFileDialog.getOpenFileName(self,"FileOpenDialog", "",
"All Files (*);;Image Files (*.png;*jpg;*.jpeg)", options=options)
if filename:
self.load_file(filename)
def load_file(self, filename):
self.filename = filename
self.source_image_view.load(filename)
self.set_filenamed_title(filename)
def detect_button_clicked(self):
xml_classifier = self.classifier_combobox.get_current_text_as_fullpath()
print("detect_button_clicked {}".format(xml_classifier))
self.source_image_view.detect(xml_classifier)
def reload_button_clicked(self):
self.load_file(self.filename)
#*************************************************
#
if main(__name__):
try:
app_name = os.path.basename(sys.argv[0])
applet = QApplication(sys.argv)
main_view = MainView(app_name, 40, 40, 800, 500)
main_view.show ()
applet.exec_()
except:
traceback.print_exc()
Last modified: 22 Mar. 2019