diff --git a/src/tools/colorTuner_py/CMakeLists.txt b/src/tools/colorTuner_py/CMakeLists.txt index 78cde7d7e..953eda7f2 100644 --- a/src/tools/colorTuner_py/CMakeLists.txt +++ b/src/tools/colorTuner_py/CMakeLists.txt @@ -16,6 +16,8 @@ install( INSTALL(FILES colorTuner.py DESTINATION share/jderobot/python/colorTuner_py/ COMPONENT colortuner-python) INSTALL(FILES resources_rc.py DESTINATION share/jderobot/python/colorTuner_py/ COMPONENT colortuner-python) +INSTALL(FILES resources/HLSColorSpace.png DESTINATION share/jderobot/python/colorTuner_py/resources/HLSColorSpace.png COMPONENT colortuner-python) + # Install gui INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/gui DESTINATION share/jderobot/python/colorTuner_py COMPONENT colortuner-python PATTERN .svn EXCLUDE) diff --git a/src/tools/colorTuner_py/filters/hsvFilter.py b/src/tools/colorTuner_py/filters/hsvFilter.py index a332601d7..665015587 100644 --- a/src/tools/colorTuner_py/filters/hsvFilter.py +++ b/src/tools/colorTuner_py/filters/hsvFilter.py @@ -4,7 +4,7 @@ import numpy as np '''Max Values supported by OpenCV''' -HSVMAX = (179,255,255) +HSVMAX = (180,255,255) HSVMIN = (0,0,0) @@ -58,14 +58,31 @@ def apply (self, img): hdwn,sdwn,vdwn = self.getDownLimit() hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV) - - # http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html - minValues = np.array([hdwn,sdwn,vdwn],dtype=np.uint8) - maxValues = np.array([hup,sup,vup], dtype=np.uint8) - - mask = cv2.inRange(hsv, minValues, maxValues) - - res = cv2.bitwise_and(img,img, mask= mask) + mask = None + res = None + + if hdwn <= hup: + # http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html + minValues = np.array([hdwn,sdwn,vdwn],dtype=np.uint8) + maxValues = np.array([hup,sup,vup], dtype=np.uint8) + + mask = cv2.inRange(hsv, minValues, maxValues) + res = cv2.bitwise_and(img,img, mask= mask) + else: + # http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html + # red goes from 240 to 20 degreess aprox + maxValues1 = np.array([hup,sup,vup],dtype=np.uint8) + minValues1 = np.array([0,sdwn,vdwn],dtype=np.uint8) + maxValues2 = np.array([180,sup,vup], dtype=np.uint8) + minValues2 = np.array([hdwn,sdwn,vdwn],dtype=np.uint8) + + mask1 = cv2.inRange(hsv, minValues1, maxValues1) + mask2 = cv2.inRange(hsv, minValues2, maxValues2) + + r1 = cv2.bitwise_and(img,img, mask= mask1) + r2 = cv2.bitwise_and(img,img, mask= mask2) + res = cv2.bitwise_or(r1, r2) + return res \ No newline at end of file diff --git a/src/tools/colorTuner_py/gui/controlWidget.py b/src/tools/colorTuner_py/gui/controlWidget.py index c2ce57de3..f300a07fc 100644 --- a/src/tools/colorTuner_py/gui/controlWidget.py +++ b/src/tools/colorTuner_py/gui/controlWidget.py @@ -18,7 +18,7 @@ # from PyQt5.QtCore import pyqtSignal, Qt -from PyQt5.QtWidgets import QWidget, QLabel, QRadioButton, QGridLayout, QVBoxLayout, QSpacerItem, QSizePolicy, QSlider, QTextEdit, QLineEdit +from PyQt5.QtWidgets import QWidget, QLabel, QRadioButton, QGridLayout, QVBoxLayout, QHBoxLayout, QSpacerItem, QSizePolicy, QSlider, QTextEdit, QLineEdit from PyQt5.QtGui import QIntValidator from filters.hsvFilter import HSVMAX, HSVMIN from filters.rgbFilter import RGBMAX, RGBMIN @@ -66,13 +66,20 @@ def initUI(self): self.gLayout.setObjectName("gLayout") ''' Vertical Layout for radio buttons ''' + self.radio1Layout = QHBoxLayout() + self.radio2Layout = QVBoxLayout() + self.radio3Layout = QVBoxLayout() self.radioLayout = QVBoxLayout() self.radioLayout.setObjectName("radioLayout") - self.radioLayout.addWidget(self.origButton) - self.radioLayout.addWidget(self.rgbButton) - self.radioLayout.addWidget(self.hsvButton) - self.radioLayout.addWidget(self.yuvButton) - self.vSpacer = QSpacerItem(30, 20, QSizePolicy.Ignored, QSizePolicy.Ignored); + self.radio1Layout.addWidget(self.origButton) + self.radio1Layout.addWidget(self.rgbButton) + self.radio1Layout.addWidget(self.hsvButton) + self.radio1Layout.addWidget(self.yuvButton) + + #self.radio1Layout.addLayout(self.radio2Layout) + #self.radio1Layout.addLayout(self.radio3Layout) + self.radioLayout.addLayout(self.radio1Layout) + self.vSpacer = QSpacerItem(10, 10, QSizePolicy.Ignored, QSizePolicy.Ignored); self.radioLayout.addItem(self.vSpacer) hmin,smin,vmin = HSVMIN diff --git a/src/tools/colorTuner_py/gui/gui.py b/src/tools/colorTuner_py/gui/gui.py index 75ddbee19..f8b02bb67 100644 --- a/src/tools/colorTuner_py/gui/gui.py +++ b/src/tools/colorTuner_py/gui/gui.py @@ -27,6 +27,7 @@ from logoWidget import LogoWidget import resources_rc import sys +import cv2 class MainWindow(QMainWindow): @@ -133,11 +134,11 @@ def __init__(self, parent=None): zoompixGroupBox = QGroupBox("Zoom x" + str(self.ZOOM_X)) grid3 = QGridLayout() self.crop = MyLabel(self, True) - self.crop.setFixedSize(200,200) + self.crop.setFixedSize(150,150) self.tootippixel = QLabel(self) self.pixel = QLabel(self) - self.pixel.setFixedSize(75,75) + self.pixel.setFixedSize(50,50) self.rgbVal = QLabel("RGB") grid3.addWidget(self.crop,0,0) @@ -151,10 +152,23 @@ def __init__(self, parent=None): grid4.addWidget(controlWidget) slidersGroupBox.setLayout(grid4) + filtGroupBox = QGroupBox("Color Space") + image = cv2.imread("resources/HLSColorSpace.png") + self.colorSpace = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + self.colorSpaceLabel = QLabel(self) + #filtImg.setScaledContents(True) + d = QImage(self.colorSpace.data, self.colorSpace.shape[1], self.colorSpace.shape[0], self.colorSpace.shape[1] * self.colorSpace.shape[2], QImage.Format_RGB888).scaled(200, 200, Qt.KeepAspectRatio) + self.colorSpaceLabel.setFixedSize(200,200) + self.colorSpaceLabel.setPixmap(QPixmap.fromImage(d)) + gridf = QGridLayout() + gridf.addWidget(self.colorSpaceLabel) + filtGroupBox.setLayout(gridf) + imagesLayout.addWidget(sourceGroupBox,0) imagesLayout.addWidget(filterGroupBox,1) controlLayout.addWidget(zoompixGroupBox,0) - controlLayout.addStretch(10) + #controlLayout.addStretch(10) + controlLayout.addWidget(filtGroupBox,0) controlLayout.addWidget(slidersGroupBox,0) mainLayout.addLayout(imagesLayout,0,0) mainLayout.addLayout(controlLayout,0,1) @@ -177,9 +191,14 @@ def updateGUI(self): filt = self.getFilterName() img = self.camera.getFilteredImage(filt) + if (filt is not "Orig"): + disc2 = self.camera.getFilter(filt).apply(self.colorSpace) + imgDisc = QImage(disc2.data, disc2.shape[1], disc2.shape[0], disc2.shape[1] * disc2.shape[2], QImage.Format_RGB888).scaled(200, 200) + self.colorSpaceLabel.setPixmap(QPixmap.fromImage(imgDisc)) if img is not None: self.imageF = QImage(img.data, img.shape[1], img.shape[0], img.shape[1] * img.shape[2], QImage.Format_RGB888).scaled(self.IMAGE_COLS_MAX, self.IMAGE_ROWS_MAX) self.filterImg.setPixmap(QPixmap.fromImage(self.imageF)) + #print "update" pos = self.sourceImg.getMousePos() diff --git a/src/tools/colorTuner_py/resources/HLSColorSpace.png b/src/tools/colorTuner_py/resources/HLSColorSpace.png new file mode 100644 index 000000000..27b7694ad Binary files /dev/null and b/src/tools/colorTuner_py/resources/HLSColorSpace.png differ