Subversion Repositories OpenCV2-Cookbook

Compare Revisions

Last modification

Ignore whitespace Rev 2 → Rev 3

/trunk/Chapter 03/colorDetection.cpp
New file
0,0 → 1,44
/*------------------------------------------------------------------------------------------*\
This file contains material supporting chapter 3 of the cookbook:
Computer Vision Programming using the OpenCV Library.
by Robert Laganiere, Packt Publishing, 2011.
 
This program is free software; permission is hereby granted to use, copy, modify,
and distribute this source code, or portions thereof, for any purpose, without fee,
subject to the restriction that the copyright notice may not be removed
or altered from any source or altered source distribution.
The software is released on an as-is basis and without any warranties of any kind.
In particular, the software is not guaranteed to be fault-tolerant or free from failure.
The author disclaims all warranties with regard to this software, any use,
and any consequent failure, is purely the responsibility of the user.
Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
\*------------------------------------------------------------------------------------------*/
 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
 
#include "colordetector.h"
 
int main()
{
// Create image processor object
ColorDetector cdetect;
 
// Read input image
cv::Mat image= cv::imread("boldt.jpg");
if (!image.data)
return 0;
 
// set input parameters
cdetect.setTargetColor(130,190,230); // here blue sky
 
// Read image, process it and display the result
cv::namedWindow("result");
cv::imshow("result",cdetect.process(image));
 
cv::waitKey();
 
return 0;
}
 
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/colordetector.h
===================================================================
--- Chapter 03/colordetector.h (revision 0)
+++ Chapter 03/colordetector.h (revision 3)
@@ -0,0 +1,97 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined COLORDETECT
+#define COLORDETECT
+
+#include <opencv2/core/core.hpp>
+
+class ColorDetector {
+
+ private:
+
+ // minimum acceptable distance
+ int minDist;
+
+ // target color
+ cv::Vec3b target;
+
+ // image containing resulting binary map
+ cv::Mat result;
+
+ // inline private member function
+ // Computes the distance from target color.
+ int getDistance(const cv::Vec3b& color) const {
+ // return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
+ return abs(color[0]-target[0])+
+ abs(color[1]-target[1])+
+ abs(color[2]-target[2]);
+ }
+
+ public:
+
+ // empty constructor
+ ColorDetector() : minDist(100) {
+
+ // default parameter initialization here
+ target[0]= target[1]= target[2]= 0;
+ }
+
+ // Getters and setters
+
+ // Sets the color distance threshold.
+ // Threshold must be positive, otherwise distance threshold
+ // is set to 0.
+ void setColorDistanceThreshold(int distance) {
+
+ if (distance<0)
+ distance=0;
+ minDist= distance;
+ }
+
+ // Gets the color distance threshold
+ int getColorDistanceThreshold() const {
+
+ return minDist;
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {
+
+ target[2]= red;
+ target[1]= green;
+ target[0]= blue;
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(cv::Vec3b color) {
+
+ target= color;
+ }
+
+ // Gets the color to be detected
+ cv::Vec3b getTargetColor() const {
+
+ return target;
+ }
+
+ // Processes the image. Returns a 1-channel binary image.
+ cv::Mat process(const cv::Mat &image);
+};
+
+
+#endif
/Chapter 03/colordetector.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/colorDetectController.h
===================================================================
--- Chapter 03/colorDetectController.h (revision 0)
+++ Chapter 03/colorDetectController.h (revision 3)
@@ -0,0 +1,127 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined CD_CNTRLLR
+#define CD_CNTRLLR
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include "colordetector.h"
+
+class ColorDetectController {
+
+ private:
+
+ static ColorDetectController *singleton; // pointer to the singleton
+
+ ColorDetector *cdetect;
+
+ // The image to be processed
+ cv::Mat image;
+ cv::Mat result;
+
+ public:
+ ColorDetectController() { // private constructor
+
+ //setting up the application
+ cdetect= new ColorDetector();
+ }
+
+ // Sets the color distance threshold
+ void setColorDistanceThreshold(int distance) {
+
+ cdetect->setColorDistanceThreshold(distance);
+ }
+
+ // Gets the color distance threshold
+ int getColorDistanceThreshold() const {
+
+ return cdetect->getColorDistanceThreshold();
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {
+
+ cdetect->setTargetColor(red,green,blue);
+ }
+
+ // Gets the color to be detected
+ void getTargetColor(unsigned char &red, unsigned char &green, unsigned char &blue) const {
+
+ cv::Vec3b color= cdetect->getTargetColor();
+
+ red= color[2];
+ green= color[1];
+ blue= color[0];
+ }
+
+ // Sets the input image. Reads it from file.
+ bool setInputImage(std::string filename) {
+
+ image= cv::imread(filename);
+
+ if (!image.data)
+ return false;
+ else
+ return true;
+ }
+
+ // Returns the current input image.
+ const cv::Mat getInputImage() const {
+
+ return image;
+ }
+
+ // Performs image processing.
+ void process() {
+
+ result= cdetect->process(image);
+ }
+
+
+ // Returns the image result from the latest processing.
+ const cv::Mat getLastResult() const {
+
+ return result;
+ }
+
+ // Deletes all processor objects created by the controller.
+ ~ColorDetectController() {
+
+ delete cdetect;
+ }
+
+ // Singleton static members
+ static ColorDetectController *getInstance() {
+
+ if (singleton == 0)
+ singleton= new ColorDetectController;
+
+ return singleton;
+ }
+
+ // Releases the singleton instance of this controller.
+ static void destroy() {
+
+ if (singleton != 0) {
+ delete singleton;
+ singleton= 0;
+ }
+ }
+};
+
+#endif
/Chapter 03/colorDetectController.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/main.cpp
===================================================================
--- Chapter 03/color_detector/main.cpp (revision 0)
+++ Chapter 03/color_detector/main.cpp (revision 3)
@@ -0,0 +1,27 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <QtGui/QApplication>
+#include "mainwindow.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow w;
+ w.show();
+ return a.exec();
+}
/Chapter 03/color_detector/main.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/color_detector.pro
===================================================================
--- Chapter 03/color_detector/color_detector.pro (revision 0)
+++ Chapter 03/color_detector/color_detector.pro (revision 3)
@@ -0,0 +1,21 @@
+# -------------------------------------------------
+# Project created by QtCreator 2010-09-10T15:33:45
+# -------------------------------------------------
+TARGET = color_detector
+TEMPLATE = app
+SOURCES += main.cpp \
+ mainwindow.cpp \
+ colordetector.cpp \
+ colordetector.cpp \
+ colorDetectController.cpp
+HEADERS += mainwindow.h \
+ colordetector.h \
+ colorDetectController.h
+FORMS += mainwindow.ui
+INCLUDEPATH += C:\OpenCV2.2\include\
+LIBS += -LC:\OpenCV2.2\lib \
+ -lopencv_core220 \
+ -lopencv_highgui220 \
+ -lopencv_imgproc220 \
+ -lopencv_features2d220 \
+ -lopencv_calib3d220
Index: Chapter 03/color_detector/mainwindow.ui
===================================================================
--- Chapter 03/color_detector/mainwindow.ui (revision 0)
+++ Chapter 03/color_detector/mainwindow.ui (revision 3)
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>394</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Color Detector (CIE Lab)</string>
+ </property>
+ <widget class="QWidget" name="centralWidget">
+ <widget class="QPushButton" name="pushButton_openImage">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>81</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Open Image</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="pushButton_color">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>81</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Select Color</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="pushButton_process">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>320</y>
+ <width>81</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Process</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>100</x>
+ <y>10</y>
+ <width>491</width>
+ <height>331</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="text">
+ <string>Image</string>
+ </property>
+ </widget>
+ <widget class="QSlider" name="verticalSlider_Threshold">
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>80</y>
+ <width>20</width>
+ <height>151</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <number>442</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_2">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>240</y>
+ <width>81</width>
+ <height>71</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Color Distance Threshold: 0</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
+ <string>File</string>
+ </property>
+ <addaction name="actionOpen_Image"/>
+ <addaction name="actionChoose_Color"/>
+ <addaction name="actionProcess"/>
+ <addaction name="separator"/>
+ <addaction name="actionQuit"/>
+ </widget>
+ <addaction name="menuFile"/>
+ </widget>
+ <widget class="QStatusBar" name="statusBar"/>
+ <action name="actionOpen_Image">
+ <property name="text">
+ <string>Open Image</string>
+ </property>
+ </action>
+ <action name="actionChoose_Color">
+ <property name="text">
+ <string>Choose Color</string>
+ </property>
+ </action>
+ <action name="actionProcess">
+ <property name="text">
+ <string>Process</string>
+ </property>
+ </action>
+ <action name="actionQuit">
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>actionQuit</sender>
+ <signal>triggered()</signal>
+ <receiver>MainWindow</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>299</x>
+ <y>199</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
Index: Chapter 03/color_detector/colordetector.cpp
===================================================================
--- Chapter 03/color_detector/colordetector.cpp (revision 0)
+++ Chapter 03/color_detector/colordetector.cpp (revision 3)
@@ -0,0 +1,57 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "colordetector.h"
+
+cv::Mat ColorDetector::process(const cv::Mat &image) {
+
+ // re-allocate binary map if necessary
+ // same size as input image, but 1-channel
+ result.create(image.rows,image.cols,CV_8U);
+
+ // re-allocate intermediate image if necessary
+ converted.create(image.rows,image.cols,image.type());
+
+ // Converting to Lab color space
+ cv::cvtColor(image, converted, CV_BGR2Lab);
+
+ // get the iterators
+ cv::Mat_<cv::Vec3b>::iterator it= converted.begin<cv::Vec3b>();
+ cv::Mat_<cv::Vec3b>::iterator itend= converted.end<cv::Vec3b>();
+ cv::Mat_<uchar>::iterator itout= result.begin<uchar>();
+
+ // for each pixel
+ for ( ; it!= itend; ++it, ++itout) {
+
+ // process each pixel ---------------------
+
+ // compute distance from target color
+ if (getDistance(*it)<minDist) {
+
+ *itout= 255;
+
+ } else {
+
+ *itout= 0;
+ }
+
+ // end of pixel processing ----------------
+ }
+
+ return result;
+}
+
/Chapter 03/color_detector/colordetector.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/colorDetectController.cpp
===================================================================
--- Chapter 03/color_detector/colorDetectController.cpp (revision 0)
+++ Chapter 03/color_detector/colorDetectController.cpp (revision 3)
@@ -0,0 +1,20 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "colorDetectController.h"
+
+ColorDetectController *ColorDetectController::singleton=0;
/Chapter 03/color_detector/colorDetectController.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/Makefile
===================================================================
--- Chapter 03/color_detector/Makefile (revision 0)
+++ Chapter 03/color_detector/Makefile (revision 3)
@@ -0,0 +1,153 @@
+#############################################################################
+# Makefile for building: color_detector
+# Generated by qmake (2.01a) (Qt 4.6.3) on: Tue Sep 21 18:30:06 2010
+# Project: color_detector.pro
+# Template: app
+# Command: c:\Qt\4.6.3\bin\qmake.exe -spec c:\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile color_detector.pro
+#############################################################################
+
+first: release
+install: release-install
+uninstall: release-uninstall
+MAKEFILE = Makefile
+QMAKE = c:\Qt\4.6.3\bin\qmake.exe
+DEL_FILE = del
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+COPY = copy /y
+COPY_FILE = $(COPY)
+COPY_DIR = xcopy /s /q /y /i
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_PROGRAM = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+DEL_FILE = del
+SYMLINK =
+DEL_DIR = rmdir
+MOVE = move
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+SUBTARGETS = \
+ release \
+ debug
+
+release: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release
+release-make_default: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release
+release-make_first: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release first
+release-all: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release all
+release-clean: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release clean
+release-distclean: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release distclean
+release-install: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release install
+release-uninstall: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release uninstall
+debug: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug
+debug-make_default: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug
+debug-make_first: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug first
+debug-all: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug all
+debug-clean: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug clean
+debug-distclean: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug distclean
+debug-install: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug install
+debug-uninstall: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug uninstall
+
+Makefile: color_detector.pro c:\Qt\4.6.3\mkspecs\win32-msvc2008\qmake.conf c:\Qt\4.6.3\mkspecs\qconfig.pri \
+ c:\Qt\4.6.3\mkspecs\features\qt_functions.prf \
+ c:\Qt\4.6.3\mkspecs\features\qt_config.prf \
+ c:\Qt\4.6.3\mkspecs\features\exclusive_builds.prf \
+ c:\Qt\4.6.3\mkspecs\features\default_pre.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\default_pre.prf \
+ c:\Qt\4.6.3\mkspecs\features\release.prf \
+ c:\Qt\4.6.3\mkspecs\features\debug_and_release.prf \
+ c:\Qt\4.6.3\mkspecs\features\default_post.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\default_post.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\rtti.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\exceptions.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\stl.prf \
+ c:\Qt\4.6.3\mkspecs\features\shared.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf \
+ c:\Qt\4.6.3\mkspecs\features\warn_on.prf \
+ c:\Qt\4.6.3\mkspecs\features\qt.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\thread.prf \
+ c:\Qt\4.6.3\mkspecs\features\moc.prf \
+ c:\Qt\4.6.3\mkspecs\features\win32\windows.prf \
+ c:\Qt\4.6.3\mkspecs\features\resources.prf \
+ c:\Qt\4.6.3\mkspecs\features\uic.prf \
+ c:\Qt\4.6.3\mkspecs\features\yacc.prf \
+ c:\Qt\4.6.3\mkspecs\features\lex.prf \
+ c:\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf \
+ c:\Qt\4.6.3\mkspecs\features\include_source_dir.prf \
+ c:\Qt\4.6.3\lib\qtmain.prl
+ $(QMAKE) -spec c:\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile color_detector.pro
+c:\Qt\4.6.3\mkspecs\qconfig.pri:
+c:\Qt\4.6.3\mkspecs\features\qt_functions.prf:
+c:\Qt\4.6.3\mkspecs\features\qt_config.prf:
+c:\Qt\4.6.3\mkspecs\features\exclusive_builds.prf:
+c:\Qt\4.6.3\mkspecs\features\default_pre.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\default_pre.prf:
+c:\Qt\4.6.3\mkspecs\features\release.prf:
+c:\Qt\4.6.3\mkspecs\features\debug_and_release.prf:
+c:\Qt\4.6.3\mkspecs\features\default_post.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\default_post.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\rtti.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\exceptions.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\stl.prf:
+c:\Qt\4.6.3\mkspecs\features\shared.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf:
+c:\Qt\4.6.3\mkspecs\features\warn_on.prf:
+c:\Qt\4.6.3\mkspecs\features\qt.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\thread.prf:
+c:\Qt\4.6.3\mkspecs\features\moc.prf:
+c:\Qt\4.6.3\mkspecs\features\win32\windows.prf:
+c:\Qt\4.6.3\mkspecs\features\resources.prf:
+c:\Qt\4.6.3\mkspecs\features\uic.prf:
+c:\Qt\4.6.3\mkspecs\features\yacc.prf:
+c:\Qt\4.6.3\mkspecs\features\lex.prf:
+c:\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf:
+c:\Qt\4.6.3\mkspecs\features\include_source_dir.prf:
+c:\Qt\4.6.3\lib\qtmain.prl:
+qmake: qmake_all FORCE
+ @$(QMAKE) -spec c:\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile color_detector.pro
+
+qmake_all: FORCE
+
+make_default: release-make_default debug-make_default FORCE
+make_first: release-make_first debug-make_first FORCE
+all: release-all debug-all FORCE
+clean: release-clean debug-clean FORCE
+ -$(DEL_FILE) ".\color_detector.intermediate.manifest"
+ -$(DEL_FILE) color_detector.exp
+distclean: release-distclean debug-distclean FORCE
+ -$(DEL_FILE) Makefile
+
+check: first
+
+release-mocclean: $(MAKEFILE).Release
+ $(MAKE) -f $(MAKEFILE).Release mocclean
+debug-mocclean: $(MAKEFILE).Debug
+ $(MAKE) -f $(MAKEFILE).Debug mocclean
+mocclean: release-mocclean debug-mocclean
+
+release-mocables: $(MAKEFILE).Release
+ $(MAKE) -f $(MAKEFILE).Release mocables
+debug-mocables: $(MAKEFILE).Debug
+ $(MAKE) -f $(MAKEFILE).Debug mocables
+mocables: release-mocables debug-mocables
+FORCE:
+
+$(MAKEFILE).Release: Makefile
+$(MAKEFILE).Debug: Makefile
Index: Chapter 03/color_detector/mainwindow.cpp
===================================================================
--- Chapter 03/color_detector/mainwindow.cpp (revision 0)
+++ Chapter 03/color_detector/mainwindow.cpp (revision 3)
@@ -0,0 +1,122 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+MainWindow::MainWindow(QWidget *parent) :
+ QMainWindow(parent),
+ ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+
+ //select color
+ connect(ui->pushButton_color, SIGNAL(clicked()), this, SLOT(setColor()));
+ connect(ui->actionChoose_Color, SIGNAL(triggered()), this, SLOT(setColor()));
+
+ //open image
+ connect(ui->pushButton_openImage, SIGNAL(clicked()), this, SLOT(setImage()));
+ connect(ui->actionOpen_Image, SIGNAL(triggered()), this, SLOT(setImage()));
+
+ //process Color Detection
+ connect(ui->pushButton_process, SIGNAL(clicked()), this, SLOT(processColorDetection()));
+ connect(ui->actionProcess, SIGNAL(triggered()), this, SLOT(processColorDetection()));
+
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+}
+
+void MainWindow::changeEvent(QEvent *e)
+{
+ QMainWindow::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+void MainWindow::setImage()
+{
+ QFileDialog::Options options;
+ QString selectedFilter;
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open Image Files"),
+ "",
+ tr("Image files (*.jpg *.jpeg *.png *.gif *.bmp)"),
+ &selectedFilter,
+ options);
+ if (!fileName.isEmpty()){
+ cv::Mat img_mat = cv::imread(fileName.toStdString(),1); //0 for grayscale
+ displayMat(img_mat);
+ }
+ //Set Filename
+ ColorDetectController::getInstance()->setInputImage(fileName.toStdString());
+}
+
+//Convert cv::Mat to QImage and display
+void MainWindow::displayMat(const cv::Mat& image){
+
+ //BGR openCV Mat to QImage
+ QImage img_qt = QImage((const unsigned char*)image.data,image.cols, image.rows, image.step, QImage::Format_RGB888);
+
+ //For Binary Images
+ if (img_qt.isNull()){
+ //ColorTable for Binary Images
+ QVector<QRgb> colorTable;
+ for (int i = 0; i < 256; i++)
+ colorTable.push_back(qRgb(i, i, i));
+
+ img_qt = QImage((const unsigned char*)image.data,image.cols, image.rows, QImage::Format_Indexed8);
+ img_qt.setColorTable(colorTable);
+ }
+
+ //Display the QImage in the Label
+ QPixmap img_pix = QPixmap::fromImage(img_qt.rgbSwapped()); //BGR to RGB
+ this->ui->label->setPixmap(img_pix.scaled(ui->label->size(), Qt::KeepAspectRatio));
+}
+
+void MainWindow::on_verticalSlider_Threshold_valueChanged(int value)
+{
+ QString cdt("Color Distance Threshold: ");
+ cdt.append(QString::number(value));
+ this->ui->label_2->setText(cdt);
+}
+
+void MainWindow::setColor()
+{
+ QColor color = QColorDialog::getColor(Qt::green, this);
+ if (color.isValid()) {
+ ColorDetectController::getInstance()->setTargetColor(color.red(),color.green(),color.blue());
+ }
+}
+
+void MainWindow::processColorDetection()
+{
+ ColorDetectController::getInstance()->setColorDistanceThreshold(ui->verticalSlider_Threshold->value());
+ ColorDetectController::getInstance()->process();
+
+ cv::Mat resulting = ColorDetectController::getInstance()->getLastResult();
+ if (!resulting.empty())
+ displayMat(resulting);
+
+}
/Chapter 03/color_detector/mainwindow.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/colordetector.h
===================================================================
--- Chapter 03/color_detector/colordetector.h (revision 0)
+++ Chapter 03/color_detector/colordetector.h (revision 3)
@@ -0,0 +1,112 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined COLORDETECT
+#define COLORDETECT
+
+#include <opencv2/core/core.hpp>
+
+class ColorDetector {
+
+ private:
+
+ // minimum acceptable distance
+ int minDist;
+
+ // target color
+ cv::Vec3b target;
+
+ // image containing resulting binary map
+ cv::Mat result;
+
+ // image containing color converted image
+ cv::Mat converted;
+
+ // inline private member function
+ // Computes the distance from target color.
+ int getDistance(const cv::Vec3b& color) const {
+ // return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
+ return abs(color[0]-target[0])+
+ abs(color[1]-target[1])+
+ abs(color[2]-target[2]);
+ }
+
+ public:
+
+ // empty constructor
+ ColorDetector() : minDist(100) {
+
+ // default parameter initialization here
+ target[0]= target[1]= target[2]= 0;
+ }
+
+ // Getters and setters
+
+ // Sets the color distance threshold.
+ // Threshold must be positive, otherwise distance threshold
+ // is set to 0.
+ void setColorDistanceThreshold(int distance) {
+
+ if (distance<0)
+ distance=0;
+ minDist= distance;
+ }
+
+ // Gets the color distance threshold
+ int getColorDistanceThreshold() const {
+
+ return minDist;
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {
+
+ cv::Mat tmp(1,1,CV_8UC3);
+ tmp.at<cv::Vec3b>(0,0)[0]= blue;
+ tmp.at<cv::Vec3b>(0,0)[1]= green;
+ tmp.at<cv::Vec3b>(0,0)[2]= red;
+
+ // Converting the target to Lab color space
+ cv::cvtColor(tmp, tmp, CV_BGR2Lab);
+
+ target= tmp.at<cv::Vec3b>(0,0);
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(cv::Vec3b color) {
+
+ cv::Mat tmp(1,1,CV_8UC3);
+ tmp.at<cv::Vec3b>(0,0)= color;
+
+ // Converting the target to Lab color space
+ cv::cvtColor(tmp, tmp, CV_BGR2Lab);
+
+ target= tmp.at<cv::Vec3b>(0,0);
+ }
+
+ // Gets the color to be detected
+ cv::Vec3b getTargetColor() const {
+
+ return target;
+ }
+
+ // Processes the image. Returns a 1-channel binary image.
+ cv::Mat process(const cv::Mat &image);
+};
+
+
+#endif
/Chapter 03/color_detector/colordetector.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/ui_mainwindow.h
===================================================================
--- Chapter 03/color_detector/ui_mainwindow.h (revision 0)
+++ Chapter 03/color_detector/ui_mainwindow.h (revision 3)
@@ -0,0 +1,131 @@
+/********************************************************************************
+** Form generated from reading UI file 'mainwindow.ui'
+**
+** Created: Tue Sep 21 18:32:00 2010
+** by: Qt User Interface Compiler version 4.6.3
+**
+** WARNING! All changes made in this file will be lost when recompiling UI file!
+********************************************************************************/
+
+#ifndef UI_MAINWINDOW_H
+#define UI_MAINWINDOW_H
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QHeaderView>
+#include <QtGui/QLabel>
+#include <QtGui/QMainWindow>
+#include <QtGui/QMenu>
+#include <QtGui/QMenuBar>
+#include <QtGui/QPushButton>
+#include <QtGui/QSlider>
+#include <QtGui/QStatusBar>
+#include <QtGui/QWidget>
+
+QT_BEGIN_NAMESPACE
+
+class Ui_MainWindow
+{
+public:
+ QAction *actionOpen_Image;
+ QAction *actionChoose_Color;
+ QAction *actionProcess;
+ QAction *actionQuit;
+ QWidget *centralWidget;
+ QPushButton *pushButton_openImage;
+ QPushButton *pushButton_color;
+ QPushButton *pushButton_process;
+ QLabel *label;
+ QSlider *verticalSlider_Threshold;
+ QLabel *label_2;
+ QMenuBar *menuBar;
+ QMenu *menuFile;
+ QStatusBar *statusBar;
+
+ void setupUi(QMainWindow *MainWindow)
+ {
+ if (MainWindow->objectName().isEmpty())
+ MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
+ MainWindow->resize(600, 394);
+ actionOpen_Image = new QAction(MainWindow);
+ actionOpen_Image->setObjectName(QString::fromUtf8("actionOpen_Image"));
+ actionChoose_Color = new QAction(MainWindow);
+ actionChoose_Color->setObjectName(QString::fromUtf8("actionChoose_Color"));
+ actionProcess = new QAction(MainWindow);
+ actionProcess->setObjectName(QString::fromUtf8("actionProcess"));
+ actionQuit = new QAction(MainWindow);
+ actionQuit->setObjectName(QString::fromUtf8("actionQuit"));
+ centralWidget = new QWidget(MainWindow);
+ centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
+ pushButton_openImage = new QPushButton(centralWidget);
+ pushButton_openImage->setObjectName(QString::fromUtf8("pushButton_openImage"));
+ pushButton_openImage->setGeometry(QRect(10, 10, 81, 23));
+ pushButton_color = new QPushButton(centralWidget);
+ pushButton_color->setObjectName(QString::fromUtf8("pushButton_color"));
+ pushButton_color->setGeometry(QRect(10, 40, 81, 23));
+ pushButton_process = new QPushButton(centralWidget);
+ pushButton_process->setObjectName(QString::fromUtf8("pushButton_process"));
+ pushButton_process->setGeometry(QRect(10, 320, 81, 23));
+ label = new QLabel(centralWidget);
+ label->setObjectName(QString::fromUtf8("label"));
+ label->setGeometry(QRect(100, 10, 491, 331));
+ label->setFrameShape(QFrame::Box);
+ verticalSlider_Threshold = new QSlider(centralWidget);
+ verticalSlider_Threshold->setObjectName(QString::fromUtf8("verticalSlider_Threshold"));
+ verticalSlider_Threshold->setGeometry(QRect(40, 80, 20, 151));
+ verticalSlider_Threshold->setMaximum(442);
+ verticalSlider_Threshold->setOrientation(Qt::Vertical);
+ label_2 = new QLabel(centralWidget);
+ label_2->setObjectName(QString::fromUtf8("label_2"));
+ label_2->setGeometry(QRect(10, 240, 81, 71));
+ label_2->setWordWrap(true);
+ MainWindow->setCentralWidget(centralWidget);
+ menuBar = new QMenuBar(MainWindow);
+ menuBar->setObjectName(QString::fromUtf8("menuBar"));
+ menuBar->setGeometry(QRect(0, 0, 600, 23));
+ menuFile = new QMenu(menuBar);
+ menuFile->setObjectName(QString::fromUtf8("menuFile"));
+ MainWindow->setMenuBar(menuBar);
+ statusBar = new QStatusBar(MainWindow);
+ statusBar->setObjectName(QString::fromUtf8("statusBar"));
+ MainWindow->setStatusBar(statusBar);
+
+ menuBar->addAction(menuFile->menuAction());
+ menuFile->addAction(actionOpen_Image);
+ menuFile->addAction(actionChoose_Color);
+ menuFile->addAction(actionProcess);
+ menuFile->addSeparator();
+ menuFile->addAction(actionQuit);
+
+ retranslateUi(MainWindow);
+ QObject::connect(actionQuit, SIGNAL(triggered()), MainWindow, SLOT(close()));
+
+ QMetaObject::connectSlotsByName(MainWindow);
+ } // setupUi
+
+ void retranslateUi(QMainWindow *MainWindow)
+ {
+ MainWindow->setWindowTitle(QApplication::translate("MainWindow", "Color Detector (CIE Lab)", 0, QApplication::UnicodeUTF8));
+ actionOpen_Image->setText(QApplication::translate("MainWindow", "Open Image", 0, QApplication::UnicodeUTF8));
+ actionChoose_Color->setText(QApplication::translate("MainWindow", "Choose Color", 0, QApplication::UnicodeUTF8));
+ actionProcess->setText(QApplication::translate("MainWindow", "Process", 0, QApplication::UnicodeUTF8));
+ actionQuit->setText(QApplication::translate("MainWindow", "Quit", 0, QApplication::UnicodeUTF8));
+ pushButton_openImage->setText(QApplication::translate("MainWindow", "Open Image", 0, QApplication::UnicodeUTF8));
+ pushButton_color->setText(QApplication::translate("MainWindow", "Select Color", 0, QApplication::UnicodeUTF8));
+ pushButton_process->setText(QApplication::translate("MainWindow", "Process", 0, QApplication::UnicodeUTF8));
+ label->setText(QApplication::translate("MainWindow", "Image", 0, QApplication::UnicodeUTF8));
+ label_2->setText(QApplication::translate("MainWindow", "Color Distance Threshold: 0", 0, QApplication::UnicodeUTF8));
+ menuFile->setTitle(QApplication::translate("MainWindow", "File", 0, QApplication::UnicodeUTF8));
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class MainWindow: public Ui_MainWindow {};
+} // namespace Ui
+
+QT_END_NAMESPACE
+
+#endif // UI_MAINWINDOW_H
/Chapter 03/color_detector/ui_mainwindow.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/colorDetectController.h
===================================================================
--- Chapter 03/color_detector/colorDetectController.h (revision 0)
+++ Chapter 03/color_detector/colorDetectController.h (revision 3)
@@ -0,0 +1,110 @@
+#if !defined CD_CNTRLLR
+#define CD_CNTRLLR
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include "colordetector.h"
+
+class ColorDetectController {
+
+ private:
+
+ static ColorDetectController *singleton; // pointer to the singleton
+
+ ColorDetector *cdetect;
+
+ // The image to be processed
+ cv::Mat image;
+ cv::Mat result;
+
+ public:
+ ColorDetectController() { // private constructor
+
+ //setting up the application
+ cdetect= new ColorDetector();
+ }
+
+ // Sets the color distance threshold
+ void setColorDistanceThreshold(int distance) {
+
+ cdetect->setColorDistanceThreshold(distance);
+ }
+
+ // Gets the color distance threshold
+ int getColorDistanceThreshold() const {
+
+ return cdetect->getColorDistanceThreshold();
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {
+
+ cdetect->setTargetColor(red,green,blue);
+ }
+
+ // Gets the color to be detected
+ void getTargetColor(unsigned char &red, unsigned char &green, unsigned char &blue) const {
+
+ cv::Vec3b color= cdetect->getTargetColor();
+
+ red= color[2];
+ green= color[1];
+ blue= color[0];
+ }
+
+ // Sets the input image. Reads it from file.
+ bool setInputImage(std::string filename) {
+
+ image= cv::imread(filename);
+
+ if (!image.data)
+ return false;
+ else
+ return true;
+ }
+
+ // Returns the current input image.
+ const cv::Mat getInputImage() const {
+
+ return image;
+ }
+
+ // Performs image processing.
+ void process() {
+
+ result= cdetect->process(image);
+ }
+
+
+ // Returns the image result from the latest processing.
+ const cv::Mat getLastResult() const {
+
+ return result;
+ }
+
+ // Deletes all processor objects created by the controller.
+ ~ColorDetectController() {
+
+ delete cdetect;
+ }
+
+ // Singleton static members
+ static ColorDetectController *getInstance() {
+
+ if (singleton == 0)
+ singleton= new ColorDetectController;
+
+ return singleton;
+ }
+
+ // Releases the singleton instance of this controller.
+ static void destroy() {
+
+ if (singleton != 0) {
+ delete singleton;
+ singleton= 0;
+ }
+ }
+};
+
+#endif
/Chapter 03/color_detector/colorDetectController.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/color_detector/mainwindow.h
===================================================================
--- Chapter 03/color_detector/mainwindow.h (revision 0)
+++ Chapter 03/color_detector/mainwindow.h (revision 3)
@@ -0,0 +1,64 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QFileDialog>
+#include <QColorDialog>
+
+//OpenCV
+#include "cv.h"
+#include "highgui.h"
+
+//color detector, controller
+#include "colorDetectController.h"
+#include "colordetector.h"
+
+namespace Ui {
+ class MainWindow;
+}
+
+class MainWindow : public QMainWindow {
+ Q_OBJECT
+public:
+ MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+protected:
+ void changeEvent(QEvent *e);
+ void displayMat(const cv::Mat& img);
+
+ //Main Image
+ //cv::Mat img_mat;
+
+private:
+ Ui::MainWindow *ui;
+
+private slots:
+ void on_pushButton_color_clicked();
+ void processColorDetection();
+ void on_verticalSlider_Threshold_valueChanged(int value);
+
+ void setColor();
+ void setImage();
+
+
+};
+
+#endif // MAINWINDOW_H
/Chapter 03/color_detector/mainwindow.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/colordetectorLab.cpp
===================================================================
--- Chapter 03/colordetectorLab.cpp (revision 0)
+++ Chapter 03/colordetectorLab.cpp (revision 3)
@@ -0,0 +1,57 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "colordetector.h"
+
+cv::Mat ColorDetector::process(const cv::Mat &image) {
+
+ // re-allocate binary map if necessary
+ // same size as input image, but 1-channel
+ result.create(image.rows,image.cols,CV_8U);
+
+ // re-allocate intermediate image if necessary
+ converted.create(image.rows,image.cols,image.type());
+
+ // Converting to Lab color space
+ cv::cvtColor(image, converted, CV_BGR2Lab);
+
+ // get the iterators
+ cv::Mat_<cv::Vec3b>::iterator it= converted.begin<cv::Vec3b>();
+ cv::Mat_<cv::Vec3b>::iterator itend= converted.end<cv::Vec3b>();
+ cv::Mat_<uchar>::iterator itout= result.begin<uchar>();
+
+ // for each pixel
+ for ( ; it!= itend; ++it, ++itout) {
+
+ // process each pixel ---------------------
+
+ // compute distance from target color
+ if (getDistance(*it)<minDist) {
+
+ *itout= 255;
+
+ } else {
+
+ *itout= 0;
+ }
+
+ // end of pixel processing ----------------
+ }
+
+ return result;
+}
+
/Chapter 03/colordetectorLab.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/colordetector.cpp
===================================================================
--- Chapter 03/colordetector.cpp (revision 0)
+++ Chapter 03/colordetector.cpp (revision 3)
@@ -0,0 +1,51 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "colordetector.h"
+
+cv::Mat ColorDetector::process(const cv::Mat &image) {
+
+ // re-allocate binary map if necessary
+ // same size as input image, but 1-channel
+ result.create(image.rows,image.cols,CV_8U);
+
+ // get the iterators
+ cv::Mat_<cv::Vec3b>::const_iterator it= image.begin<cv::Vec3b>();
+ cv::Mat_<cv::Vec3b>::const_iterator itend= image.end<cv::Vec3b>();
+ cv::Mat_<uchar>::iterator itout= result.begin<uchar>();
+
+ // for each pixel
+ for ( ; it!= itend; ++it, ++itout) {
+
+ // process each pixel ---------------------
+
+ // compute distance from target color
+ if (getDistance(*it)<minDist) {
+
+ *itout= 255;
+
+ } else {
+
+ *itout= 0;
+ }
+
+ // end of pixel processing ----------------
+ }
+
+ return result;
+}
+
/Chapter 03/colordetector.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/README.txt
===================================================================
--- Chapter 03/README.txt (revision 0)
+++ Chapter 03/README.txt (revision 3)
@@ -0,0 +1,23 @@
+This directory contains material supporting chapter 3 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+Files:
+ colorDetection.h
+ colorDetection.cpp
+ colordetector.cpp
+correspond to Recipe:
+Using the Strategy Pattern in Algorithm Design
+
+Files:
+ colorDetectContoller.h
+ colorDetectContoller.cpp
+correspond to Recipes:
+Using the Controller Pattern to Communicate with Processing Modules
+Using the Singleton Design Pattern
+
+Directory:
+ color_detector
+correspond to Recipes:
+Using the Model-View-Controller Pattern to Design an Application
+Converting Color Spaces
/Chapter 03/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/colorDetectController.cpp
===================================================================
--- Chapter 03/colorDetectController.cpp (revision 0)
+++ Chapter 03/colorDetectController.cpp (revision 3)
@@ -0,0 +1,20 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "colorDetectController.h"
+
+ColorDetectController *ColorDetectController::singleton=0;
/Chapter 03/colorDetectController.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 03/colordetectorLab.h
===================================================================
--- Chapter 03/colordetectorLab.h (revision 0)
+++ Chapter 03/colordetectorLab.h (revision 3)
@@ -0,0 +1,112 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 3 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined COLORDETECT
+#define COLORDETECT
+
+#include <opencv2/core/core.hpp>
+
+class ColorDetector {
+
+ private:
+
+ // minimum acceptable distance
+ int minDist;
+
+ // target color
+ cv::Vec3b target;
+
+ // image containing resulting binary map
+ cv::Mat result;
+
+ // image containing color converted image
+ cv::Mat converted;
+
+ // inline private member function
+ // Computes the distance from target color.
+ int getDistance(const cv::Vec3b& color) const {
+ // return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
+ return abs(color[0]-target[0])+
+ abs(color[1]-target[1])+
+ abs(color[2]-target[2]);
+ }
+
+ public:
+
+ // empty constructor
+ ColorDetector() : minDist(100) {
+
+ // default parameter initialization here
+ target[0]= target[1]= target[2]= 0;
+ }
+
+ // Getters and setters
+
+ // Sets the color distance threshold.
+ // Threshold must be positive, otherwise distance threshold
+ // is set to 0.
+ void setColorDistanceThreshold(int distance) {
+
+ if (distance<0)
+ distance=0;
+ minDist= distance;
+ }
+
+ // Gets the color distance threshold
+ int getColorDistanceThreshold() const {
+
+ return minDist;
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {
+
+ cv::Mat tmp(1,1,CV_8UC3);
+ tmp.at<cv::Vec3b>(0,0)[0]= blue;
+ tmp.at<cv::Vec3b>(0,0)[1]= green;
+ tmp.at<cv::Vec3b>(0,0)[2]= red;
+
+ // Converting the target to Lab color space
+ cv::cvtColor(tmp, tmp, CV_BGR2Lab);
+
+ target= tmp.at<cv::Vec3b>(0,0);
+ }
+
+ // Sets the color to be detected
+ void setTargetColor(cv::Vec3b color) {
+
+ cv::Mat tmp(1,1,CV_8UC3);
+ tmp.at<cv::Vec3b>(0,0)= color;
+
+ // Converting the target to Lab color space
+ cv::cvtColor(tmp, tmp, CV_BGR2Lab);
+
+ target= tmp.at<cv::Vec3b>(0,0);
+ }
+
+ // Gets the color to be detected
+ cv::Vec3b getTargetColor() const {
+
+ return target;
+ }
+
+ // Processes the image. Returns a 1-channel binary image.
+ cv::Mat process(const cv::Mat &image);
+};
+
+
+#endif
/Chapter 03/colordetectorLab.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/finder.cpp
===================================================================
--- Chapter 04/finder.cpp (revision 0)
+++ Chapter 04/finder.cpp (revision 3)
@@ -0,0 +1,128 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 4 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+using namespace std;
+
+#include <opencv2\core\core.hpp>
+#include <opencv2\highgui\highgui.hpp>
+#include <opencv2\imgproc\imgproc.hpp>
+#include <opencv2\video\tracking.hpp>
+
+#include "objectFinder.h"
+#include "colorhistogram.h"
+
+int main()
+{
+ // Read reference image
+ cv::Mat image= cv::imread("../baboon1.jpg");
+ if (!image.data)
+ return 0;
+
+ // Define ROI
+ cv::Mat imageROI= image(cv::Rect(110,260,35,40));
+ cv::rectangle(image, cv::Rect(110,260,35,40),cv::Scalar(0,0,255));
+
+ // Display image
+ cv::namedWindow("Image");
+ cv::imshow("Image",image);
+
+ // Get the Hue histogram
+ int minSat=65;
+ ColorHistogram hc;
+ cv::MatND colorhist= hc.getHueHistogram(imageROI,minSat);
+
+ ObjectFinder finder;
+ finder.setHistogram(colorhist);
+ finder.setThreshold(0.2f);
+
+ // Convert to HSV space
+ cv::Mat hsv;
+ cv::cvtColor(image, hsv, CV_BGR2HSV);
+
+ // Split the image
+ vector<cv::Mat> v;
+ cv::split(hsv,v);
+
+ // Eliminate pixels with low saturation
+ cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
+ cv::namedWindow("Saturation");
+ cv::imshow("Saturation",v[1]);
+
+ // Get back-projection of hue histogram
+ int ch[1]={0};
+ cv::Mat result= finder.find(hsv,0.0f,180.0f,ch,1);
+
+ cv::namedWindow("Result Hue");
+ cv::imshow("Result Hue",result);
+
+ cv::bitwise_and(result,v[1],result);
+ cv::namedWindow("Result Hue and");
+ cv::imshow("Result Hue and",result);
+
+ // Second image
+ image= cv::imread("../baboon3.jpg");
+
+ // Display image
+ cv::namedWindow("Image 2");
+ cv::imshow("Image 2",image);
+
+ // Convert to HSV space
+ cv::cvtColor(image, hsv, CV_BGR2HSV);
+
+ // Split the image
+ cv::split(hsv,v);
+
+ // Eliminate pixels with low saturation
+ cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
+ cv::namedWindow("Saturation");
+ cv::imshow("Saturation",v[1]);
+
+ // Get back-projection of hue histogram
+ result= finder.find(hsv,0.0f,180.0f,ch,1);
+
+ cv::namedWindow("Result Hue");
+ cv::imshow("Result Hue",result);
+
+ // Eliminate low stauration pixels
+ cv::bitwise_and(result,v[1],result);
+ cv::namedWindow("Result Hue and");
+ cv::imshow("Result Hue and",result);
+
+ // Get back-projection of hue histogram
+ finder.setThreshold(-1.0f);
+ result= finder.find(hsv,0.0f,180.0f,ch,1);
+ cv::bitwise_and(result,v[1],result);
+ cv::namedWindow("Result Hue and raw");
+ cv::imshow("Result Hue and raw",result);
+
+ cv::Rect rect(110,260,35,40);
+ cv::rectangle(image, rect, cv::Scalar(0,0,255));
+
+ cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER,10,0.01);
+ cout << "meanshift= " << cv::meanShift(result,rect,criteria) << endl;
+
+ cv::rectangle(image, rect, cv::Scalar(0,255,0));
+
+ // Display image
+ cv::namedWindow("Image 2 result");
+ cv::imshow("Image 2 result",image);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 04/finder.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/README.txt
===================================================================
--- Chapter 04/README.txt (revision 0)
+++ Chapter 04/README.txt (revision 3)
@@ -0,0 +1,28 @@
+This directory contains material supporting chapter 4 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+Files:
+ histogram.h
+ histograms.cpp
+correspond to Recipes:
+Computing the Image Histogram
+Applying Look-up Tables to Modify Image Appearance
+
+Files:
+ colorhistogram.h
+ objectfinder.h
+ objectfinder.cpp
+correspond to Recipe:
+Backprojecting a Histogram to Detect Specific Image Content
+
+File:
+ finder.cpp
+correspond to Recipe:
+Using the Meanshift Algorithm to Find an Object
+
+Files:
+ imageComparator.h
+ retrieve.cpp
+correspond to Recipes:
+Retrieving Similar Images using Histogram Comparison
/Chapter 04/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/objectfinder.cpp
===================================================================
--- Chapter 04/objectfinder.cpp (revision 0)
+++ Chapter 04/objectfinder.cpp (revision 3)
@@ -0,0 +1,186 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 4 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+using namespace std;
+
+#include "cv.h"
+#include "highgui.h"
+
+#include "histogram.h"
+#include "objectFinder.h"
+#include "colorhistogram.h"
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../waves.jpg",0);
+ if (!image.data)
+ return 0;
+
+ // define image ROI
+ cv::Mat imageROI;
+ imageROI= image(cv::Rect(360,55,40,50)); // Cloud region
+
+ // Display reference patch
+ cv::namedWindow("Reference");
+ cv::imshow("Reference",imageROI);
+
+ // Find histogram of reference
+ Histogram1D h;
+ cv::MatND hist= h.getHistogram(imageROI);
+ cv::namedWindow("Reference Hist");
+ cv::imshow("Reference Hist",h.getHistogramImage(imageROI));
+
+ // Create the objectfinder
+ ContentFinder finder;
+ finder.setHistogram(hist);
+
+ finder.setThreshold(-1.0f);
+
+ // Get back-projection
+ cv::Mat result1;
+ result1= finder.find(image);
+
+ // Create negative image and display result
+ cv::Mat tmp;
+ result1.convertTo(tmp,CV_8U,-1.0,255.0);
+ cv::namedWindow("Backprojection result");
+ cv::imshow("Backprojection result",tmp);
+
+ // Get binary back-projection
+ finder.setThreshold(0.12f);
+ result1= finder.find(image);
+
+ // Draw a rectangle around the reference area
+ cv::rectangle(image,cv::Rect(360,55,40,50),cv::Scalar(0,0,0));
+
+ // Display image
+ cv::namedWindow("Image");
+ cv::imshow("Image",image);
+
+ // Display result
+ cv::namedWindow("Detection Result");
+ cv::imshow("Detection Result",result1);
+
+ // Second test image
+ cv::Mat image2= cv::imread("../dog.jpg",0);
+ cv::Mat result2;
+ result2= finder.find(image2);
+
+ // Display result
+ cv::namedWindow("Result (2)");
+ cv::imshow("Result (2)",result2);
+
+ // Load color image
+ ColorHistogram hc;
+ cv::Mat color= cv::imread("../waves.jpg");
+ color= hc.colorReduce(color,32);
+ cv::namedWindow("Color Image");
+ cv::imshow("Color Image",color);
+
+ imageROI= color(cv::Rect(0,0,165,75)); // blue sky area
+
+ // Get 3D color histogram
+ cv::MatND shist= hc.getHistogram(imageROI);
+ // Histograms with SparseMat does not work with OpenCV2.1
+ // cv::SparseMat shist= hc.getSparseHistogram(imageROI);
+
+ finder.setHistogram(shist);
+ finder.setThreshold(0.05f);
+
+ // Get back-projection of color histogram
+ result1= finder.find(color);
+
+ cv::namedWindow("Color Backproject Result");
+ cv::imshow("Color Backproject Result",result1);
+
+ // Second color image
+ cv::Mat color2= cv::imread("../dog.jpg");
+ color2= hc.colorReduce(color2,32);
+
+ // Get back-projection of color histogram
+ result2= finder.find(color2);
+
+ cv::namedWindow("Result color (2)");
+ cv::imshow("Result color (2)",result2);
+
+ // Get ab color histogram
+ color= cv::imread("../waves.jpg");
+ imageROI= color(cv::Rect(0,0,165,75)); // blue sky area
+ cv::MatND colorhist= hc.getabHistogram(imageROI);
+
+ finder.setHistogram(colorhist);
+ finder.setThreshold(0.05f);
+
+ // Convert to Lab space
+ cv::Mat lab;
+ cv::cvtColor(color, lab, CV_BGR2Lab);
+
+ // Get back-projection of ab histogram
+ int ch[2]={1,2};
+ result1= finder.find(lab,-128.0f,127.0f,ch,2);
+
+ cv::namedWindow("Result ab (1)");
+ cv::imshow("Result ab (1)",result1);
+
+ // Second color image
+ color2= cv::imread("../dog.jpg");
+
+ cv::namedWindow("Color Image (2)");
+ cv::imshow("Color Image (2)",color2);
+
+ cv::cvtColor(color2, lab, CV_BGR2Lab);
+
+ result2= finder.find(lab,-128.0f,127.0f,ch,2);
+
+ cv::namedWindow("Result ab (2)");
+ cv::imshow("Result ab (2)",result2);
+
+ // Get Hue color histogram
+ color= cv::imread("../waves.jpg");
+ imageROI= color(cv::Rect(0,0,165,75)); // blue sky area
+ colorhist= hc.getHueHistogram(imageROI);
+
+ finder.setHistogram(colorhist);
+ finder.setThreshold(0.3f);
+
+ // Convert to HSV space
+ cv::Mat hsv;
+ cv::cvtColor(color, hsv, CV_BGR2HSV);
+
+ // Get back-projection of hue histogram
+ ch[0]=0;
+ result1= finder.find(hsv,0.0f,180.0f,ch,1);
+
+ cv::namedWindow("Result Hue (1)");
+ cv::imshow("Result Hue (1)",result1);
+
+ // Second color image
+ color2= cv::imread("../dog.jpg");
+
+ cv::cvtColor(color2, hsv, CV_BGR2HSV);
+
+ result2= finder.find(hsv,0.0f,180.0f,ch,1);
+
+ cv::namedWindow("Result Hue (2)");
+ cv::imshow("Result Hue (2)",result2);
+
+ cv::waitKey();
+ return 0;
+}
+
/Chapter 04/objectfinder.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/imageComparator.h
===================================================================
--- Chapter 04/imageComparator.h (revision 0)
+++ Chapter 04/imageComparator.h (revision 3)
@@ -0,0 +1,72 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 4 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined ICOMPARATOR
+#define ICOMPARATOR
+
+#include <opencv2\core\core.hpp>
+#include <opencv2\imgproc\imgproc.hpp>
+#include "colorhistogram.h"
+
+class ImageComparator {
+
+ private:
+
+ cv::Mat reference;
+ cv::Mat input;
+ cv::MatND refH;
+ cv::MatND inputH;
+
+ ColorHistogram hist;
+ int div;
+
+ public:
+
+ ImageComparator() : div(32) {
+
+ }
+
+ // Color reduction factor
+ // The comparaison will be made on images with
+ // color space reduced by this factor in each dimension
+ void setColorReduction( int factor) {
+
+ div= factor;
+ }
+
+ int getColorReduction() {
+
+ return div;
+ }
+
+ void setReferenceImage(const cv::Mat& image) {
+
+ reference= hist.colorReduce(image,div);
+ refH= hist.getHistogram(reference);
+ }
+
+ double compare(const cv::Mat& image) {
+
+ input= hist.colorReduce(image,div);
+ inputH= hist.getHistogram(input);
+
+ return cv::compareHist(refH,inputH,CV_COMP_INTERSECT);
+ }
+};
+
+
+#endif
/Chapter 04/imageComparator.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/histograms.cpp
===================================================================
--- Chapter 04/histograms.cpp (revision 0)
+++ Chapter 04/histograms.cpp (revision 3)
@@ -0,0 +1,96 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 4 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+using namespace std;
+
+#include "cv.h"
+#include "highgui.h"
+#include "histogram.h"
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../group.jpg",0);
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Image");
+ cv::imshow("Image",image);
+
+ // The histogram object
+ Histogram1D h;
+
+ // Compute the histogram
+ cv::MatND histo= h.getHistogram(image);
+
+ // Loop over each bin
+ for (int i=0; i<256; i++)
+ cout << "Value " << i << " = " << histo.at<float>(i) << endl;
+
+ // Display a histogram as an image
+ cv::namedWindow("Histogram");
+ cv::imshow("Histogram",h.getHistogramImage(image));
+
+ // creating a binary image by thresholding at the valley
+ cv::Mat thresholded;
+ cv::threshold(image,thresholded,60,255,cv::THRESH_BINARY);
+
+ // Display the thresholded image
+ cv::namedWindow("Binary Image");
+ cv::imshow("Binary Image",thresholded);
+ cv::imwrite("binary.bmp",thresholded);
+
+ // Equalize the image
+ cv::Mat eq= h.equalize(image);
+
+ // Show the result
+ cv::namedWindow("Equalized Image");
+ cv::imshow("Equalized Image",eq);
+
+ // Show the new histogram
+ cv::namedWindow("Equalized Histogram");
+ cv::imshow("Equalized Histogram",h.getHistogramImage(eq));
+
+ // Stretch the image ignoring bins with less than 5 pixels
+ cv::Mat str= h.stretch(image,5);
+
+ // Show the result
+ cv::namedWindow("Stretched Image");
+ cv::imshow("Stretched Image",str);
+
+ // Show the new histogram
+ cv::namedWindow("Stretched Histogram");
+ cv::imshow("Stretched Histogram",h.getHistogramImage(str));
+
+ // Create an image inversion table
+ uchar lookup[256];
+
+ for (int i=0; i<256; i++) {
+
+ lookup[i]= 255-i;
+ }
+
+ // Apply lookup and display negative image
+ cv::namedWindow("Negative image");
+ cv::imshow("Negative image",h.applyLookUp(image,lookup));
+
+ cv::waitKey();
+ return 0;
+}
+
/Chapter 04/histograms.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/colorhistogram.h
===================================================================
--- Chapter 04/colorhistogram.h (revision 0)
+++ Chapter 04/colorhistogram.h (revision 3)
@@ -0,0 +1,169 @@
+#if !defined COLHISTOGRAM
+#define COLHISTOGRAM
+
+#include <opencv2\core\core.hpp>
+#include <opencv2\imgproc\imgproc.hpp>
+
+class ColorHistogram {
+
+ private:
+
+ int histSize[3];
+ float hranges[2];
+ const float* ranges[3];
+ int channels[3];
+
+ public:
+
+ ColorHistogram() {
+
+ // Prepare arguments for a color histogram
+ histSize[0]= histSize[1]= histSize[2]= 256;
+ hranges[0]= 0.0; // BRG range
+ hranges[1]= 255.0;
+ ranges[0]= hranges; // all channels have the same range
+ ranges[1]= hranges;
+ ranges[2]= hranges;
+ channels[0]= 0; // the three channels
+ channels[1]= 1;
+ channels[2]= 2;
+ }
+
+ // Computes the histogram.
+ cv::MatND getHistogram(const cv::Mat &image) {
+
+ cv::MatND hist;
+
+ // BGR color histogram
+ hranges[0]= 0.0; // BRG range
+ hranges[1]= 255.0;
+ channels[0]= 0; // the three channels
+ channels[1]= 1;
+ channels[2]= 2;
+
+ // Compute histogram
+ cv::calcHist(&image,
+ 1, // histogram of 1 image only
+ channels, // the channel used
+ cv::Mat(), // no mask is used
+ hist, // the resulting histogram
+ 3, // it is a 3D histogram
+ histSize, // number of bins
+ ranges // pixel value range
+ );
+
+ return hist;
+ }
+
+ // Computes the histogram.
+ cv::SparseMat getSparseHistogram(const cv::Mat &image) {
+
+ cv::SparseMat hist(3,histSize,CV_32F);
+
+ // BGR color histogram
+ hranges[0]= 0.0; // BRG range
+ hranges[1]= 255.0;
+ channels[0]= 0; // the three channels
+ channels[1]= 1;
+ channels[2]= 2;
+
+ // Compute histogram
+ cv::calcHist(&image,
+ 1, // histogram of 1 image only
+ channels, // the channel used
+ cv::Mat(), // no mask is used
+ hist, // the resulting histogram
+ 3, // it is a 3D histogram
+ histSize, // number of bins
+ ranges // pixel value range
+ );
+
+ return hist;
+ }
+
+ // Computes the 2D ab histogram.
+ // BGR source image is converted to Lab
+ cv::MatND getabHistogram(const cv::Mat &image) {
+
+ cv::MatND hist;
+
+ // Convert to Lab color space
+ cv::Mat lab;
+ cv::cvtColor(image, lab, CV_BGR2Lab);
+
+ // Prepare arguments for a 2D color histogram
+ hranges[0]= -128.0;
+ hranges[1]= 127.0;
+ channels[0]= 1; // the two channels used are ab
+ channels[1]= 2;
+
+ // Compute histogram
+ cv::calcHist(&lab,
+ 1, // histogram of 1 image only
+ channels, // the channel used
+ cv::Mat(), // no mask is used
+ hist, // the resulting histogram
+ 2, // it is a 2D histogram
+ histSize, // number of bins
+ ranges // pixel value range
+ );
+
+ return hist;
+ }
+
+ // Computes the 1D Hue histogram with a mask.
+ // BGR source image is converted to HSV
+ cv::MatND getHueHistogram(const cv::Mat &image) {
+
+ cv::MatND hist;
+
+ // Convert to Lab color space
+ cv::Mat hue;
+ cv::cvtColor(image, hue, CV_BGR2HSV);
+
+ // Prepare arguments for a 1D hue histogram
+ hranges[0]= 0.0;
+ hranges[1]= 180.0;
+ channels[0]= 0; // the hue channel
+
+ // Compute histogram
+ cv::calcHist(&hue,
+ 1, // histogram of 1 image only
+ channels, // the channel used
+ cv::Mat(), // no mask is used
+ hist, // the resulting histogram
+ 1, // it is a 1D histogram
+ histSize, // number of bins
+ ranges // pixel value range
+ );
+
+ return hist;
+ }
+
+ cv::Mat colorReduce(const cv::Mat &image, int div=64) {
+
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ cv::Mat_<cv::Vec3b>::const_iterator it= image.begin<cv::Vec3b>();
+ cv::Mat_<cv::Vec3b>::const_iterator itend= image.end<cv::Vec3b>();
+
+ // Set output image (always 1-channel)
+ cv::Mat result(image.rows,image.cols,image.type());
+ cv::Mat_<cv::Vec3b>::iterator itr= result.begin<cv::Vec3b>();
+
+ for ( ; it!= itend; ++it, ++itr) {
+
+ (*itr)[0]= ((*it)[0]&mask) + div/2;
+ (*itr)[1]= ((*it)[1]&mask) + div/2;
+ (*itr)[2]= ((*it)[2]&mask) + div/2;
+ }
+
+ return result;
+}
+
+};
+
+
+#endif
/Chapter 04/colorhistogram.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/histogram.h
===================================================================
--- Chapter 04/histogram.h (revision 0)
+++ Chapter 04/histogram.h (revision 3)
@@ -0,0 +1,192 @@
+#if !defined HISTOGRAM
+#define HISTOGRAM
+
+#include <opencv2\core\core.hpp>
+#include <opencv2\imgproc\imgproc.hpp>
+
+class Histogram1D {
+
+ private:
+
+ int histSize[1];
+ float hranges[2];
+ const float* ranges[1];
+ int channels[1];
+
+ public:
+
+ Histogram1D() {
+
+ // Prepare arguments for 1D histogram
+ histSize[0]= 256;
+ hranges[0]= 0.0;
+ hranges[1]= 255.0;
+ ranges[0]= hranges;
+ channels[0]= 0; // by default, we look at channel 0
+ }
+
+ // Sets the channel on which histogram will be calculated.
+ // By default it is channel 0.
+ void setChannel(int c) {
+
+ channels[0]= c;
+ }
+
+ // Gets the channel used.
+ int getChannel() {
+
+ return channels[0];
+ }
+
+ // Sets the range for the pixel values.
+ // By default it is [0,255]
+ void setRange(float minValue, float maxValue) {
+
+ hranges[0]= minValue;
+ hranges[1]= maxValue;
+ }
+
+ // Gets the min pixel value.
+ float getMinValue() {
+
+ return hranges[0];
+ }
+
+ // Gets the max pixel value.
+ float getMaxValue() {
+
+ return hranges[1];
+ }
+
+ // Sets the number of bins in histogram.
+ // By default it is 256.
+ void setNBins(int nbins) {
+
+ histSize[0]= nbins;
+ }
+
+ // Gets the number of bins in histogram.
+ int getNBins() {
+
+ return histSize[0];
+ }
+
+ // Computes the 1D histogram.
+ cv::MatND getHistogram(const cv::Mat &image) {
+
+ cv::MatND hist;
+
+ // Compute histogram
+ cv::calcHist(&image,
+ 1, // histogram of 1 image only
+ channels, // the channel used
+ cv::Mat(), // no mask is used
+ hist, // the resulting histogram
+ 1, // it is a 1D histogram
+ histSize, // number of bins
+ ranges // pixel value range
+ );
+
+ return hist;
+ }
+
+ // Computes the 1D histogram and returns an image of it.
+ cv::Mat getHistogramImage(const cv::Mat &image){
+
+ // Compute histogram first
+ cv::MatND hist= getHistogram(image);
+
+ // Get min and max bin values
+ double maxVal=0;
+ double minVal=0;
+ cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);
+
+ // Image on which to display histogram
+ cv::Mat histImg(histSize[0], histSize[0], CV_8U,cv::Scalar(255));
+
+ // set highest point at 90% of nbins
+ int hpt = static_cast<int>(0.9*histSize[0]);
+
+ // Draw vertical line for each bin
+ for( int h = 0; h < histSize[0]; h++ ) {
+
+ float binVal = hist.at<float>(h);
+ int intensity = static_cast<int>(binVal*hpt/maxVal);
+ cv::line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
+ }
+
+ return histImg;
+ }
+
+ // Equalizes the source image.
+ cv::Mat equalize(const cv::Mat &image) {
+
+ cv::Mat result;
+ cv::equalizeHist(image,result);
+
+ return result;
+ }
+
+ // Stretches the source image.
+ cv::Mat stretch(const cv::Mat &image, int minValue=0) {
+
+ // Compute histogram first
+ cv::MatND hist= getHistogram(image);
+
+ // find left extremity of the histogram
+ int imin= 0;
+ for( ; imin < histSize[0]; imin++ ) {
+ std::cout<<hist.at<float>(imin)<<std::endl;
+ if (hist.at<float>(imin) > minValue)
+ break;
+ }
+
+ // find right extremity of the histogram
+ int imax= histSize[0]-1;
+ for( ; imax >= 0; imax-- ) {
+
+ if (hist.at<float>(imax) > minValue)
+ break;
+ }
+
+ // Create lookup table
+ int dims[1]={256};
+ cv::MatND lookup(1,dims,CV_8U);
+
+ for (int i=0; i<256; i++) {
+
+ if (i < imin) lookup.at<uchar>(i)= 0;
+ else if (i > imax) lookup.at<uchar>(i)= 255;
+ else lookup.at<uchar>(i)= static_cast<uchar>(255.0*(i-imin)/(imax-imin)+0.5);
+ }
+
+ // Apply lookup table
+ cv::Mat result;
+ result= applyLookUp(image,lookup);
+
+ return result;
+ }
+
+ // Applies a lookup table transforming an input image into a 1-channel image
+ cv::Mat applyLookUp(const cv::Mat& image, const cv::MatND& lookup) {
+
+ // Set output image (always 1-channel)
+ cv::Mat result(image.rows,image.cols,CV_8U);
+ cv::Mat_<uchar>::iterator itr= result.begin<uchar>();
+
+ // Iterates over the input image
+ cv::Mat_<uchar>::const_iterator it= image.begin<uchar>();
+ cv::Mat_<uchar>::const_iterator itend= image.end<uchar>();
+
+ // Applies lookup to each pixel
+ for ( ; it!= itend; ++it, ++itr) {
+
+ *itr= lookup.at<uchar>(*it);
+ }
+
+ return result;
+ }
+};
+
+
+#endif
/Chapter 04/histogram.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/objectFinder.h
===================================================================
--- Chapter 04/objectFinder.h (revision 0)
+++ Chapter 04/objectFinder.h (revision 3)
@@ -0,0 +1,142 @@
+#if !defined OFINDER
+#define OFINDER
+
+#include <opencv2\core\core.hpp>
+#include <opencv2\imgproc\imgproc.hpp>
+
+class ObjectFinder {
+
+ private:
+
+ float hranges[2];
+ const float* ranges[3];
+ int channels[3];
+
+ float threshold;
+ cv::MatND histogram;
+ cv::SparseMat shistogram;
+ bool isSparse;
+
+ public:
+
+ ObjectFinder() : threshold(0.1f), isSparse(false) {
+
+ ranges[0]= hranges; // all channels have the same range
+ ranges[1]= hranges;
+ ranges[2]= hranges;
+ }
+
+ // Sets the threshold on histogram values [0,1]
+ void setThreshold(float t) {
+
+ threshold= t;
+ }
+
+ // Gets the threshold
+ float getThreshold() {
+
+ return threshold;
+ }
+
+ // Sets the reference histogram
+ void setHistogram(const cv::MatND& h) {
+
+ isSparse= false;
+ histogram= h;
+ cv::normalize(histogram,histogram,1.0);
+ }
+
+ // Sets the reference histogram
+ void setHistogram(const cv::SparseMat& h) {
+
+ isSparse= true;
+ shistogram= h;
+ cv::normalize(shistogram,shistogram,1.0,cv::NORM_L2);
+ }
+
+ // Finds the pixels belonging to the histogram
+ cv::Mat find(const cv::Mat& image) {
+
+ cv::Mat result;
+
+ hranges[0]= 0.0; // range [0,255]
+ hranges[1]= 255.0;
+ channels[0]= 0; // the three channels
+ channels[1]= 1;
+ channels[2]= 2;
+
+ if (isSparse) { // call the right function based on histogram type
+
+ cv::calcBackProject(&image,
+ 1, // one image
+ channels, // vector specifying what histogram dimensions belong to what image channels
+ shistogram, // the histogram we are using
+ result, // the resulting back projection image
+ ranges, // the range of values, for each dimension
+ 255.0 // the scaling factor is chosen such that a histogram value of 1 maps to 255
+ );
+
+ } else {
+
+ cv::calcBackProject(&image,
+ 1, // one image
+ channels, // vector specifying what histogram dimensions belong to what image channels
+ histogram, // the histogram we are using
+ result, // the resulting back projection image
+ ranges, // the range of values, for each dimension
+ 255.0 // the scaling factor is chosen such that a histogram value of 1 maps to 255
+ );
+ }
+
+
+ // Threshold back projection to obtain a binary image
+ if (threshold>0.0)
+ cv::threshold(result, result, 255*threshold, 255, cv::THRESH_BINARY);
+
+ return result;
+ }
+
+ cv::Mat find(const cv::Mat& image, float minValue, float maxValue, int *channels, int dim) {
+
+ cv::Mat result;
+
+ hranges[0]= minValue;
+ hranges[1]= maxValue;
+
+ for (int i=0; i<dim; i++)
+ this->channels[i]= channels[i];
+
+ if (isSparse) { // call the right function based on histogram type
+
+ cv::calcBackProject(&image,
+ 1, // we only use one image at a time
+ channels, // vector specifying what histogram dimensions belong to what image channels
+ shistogram, // the histogram we are using
+ result, // the resulting back projection image
+ ranges, // the range of values, for each dimension
+ 255.0 // the scaling factor is chosen such that a histogram value of 1 maps to 255
+ );
+
+ } else {
+
+ cv::calcBackProject(&image,
+ 1, // we only use one image at a time
+ channels, // vector specifying what histogram dimensions belong to what image channels
+ histogram, // the histogram we are using
+ result, // the resulting back projection image
+ ranges, // the range of values, for each dimension
+ 255.0 // the scaling factor is chosen such that a histogram value of 1 maps to 255
+ );
+ }
+
+ // Threshold back projection to obtain a binary image
+ if (threshold>0.0)
+ cv::threshold(result, result, 255*threshold, 255, cv::THRESH_BINARY);
+
+ return result;
+ }
+
+};
+
+
+#endif
/Chapter 04/objectFinder.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 04/retrieve.cpp
===================================================================
--- Chapter 04/retrieve.cpp (revision 0)
+++ Chapter 04/retrieve.cpp (revision 3)
@@ -0,0 +1,74 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 4 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+using namespace std;
+
+#include <opencv2\core\core.hpp>
+#include <opencv2\highgui\highgui.hpp>
+
+#include "imageComparator.h"
+
+int main()
+{
+ // Read reference image
+ cv::Mat image= cv::imread("../waves.jpg");
+ if (!image.data)
+ return 0;
+
+ // Display image
+ cv::namedWindow("Query Image");
+ cv::imshow("Query Image",image);
+
+ ImageComparator c;
+ c.setReferenceImage(image);
+
+ // Read an image and compare it with reference
+ cv::Mat input= cv::imread("../dog.jpg");
+ cout << "waves vs dog: " << c.compare(input) << endl;
+
+ // Read an image and compare it with reference
+ input= cv::imread("../marais.jpg");
+ cout << "waves vs marais: " << c.compare(input) << endl;
+
+ // Read an image and compare it with reference
+ input= cv::imread("../bear.jpg");
+ cout << "waves vs bear: " << c.compare(input) << endl;
+
+ // Read an image and compare it with reference
+ input= cv::imread("../beach.jpg");
+ cout << "waves vs beach: " << c.compare(input) << endl;
+
+ // Read an image and compare it with reference
+ input= cv::imread("../polar.jpg");
+ cout << "waves vs polar: " << c.compare(input) << endl;
+
+ // Read an image and compare it with reference
+ input= cv::imread("../moose.jpg");
+ cout << "waves vs moose: " << c.compare(input) << endl;
+
+ // Read an image and compare it with reference
+ input= cv::imread("../lake.jpg");
+ cout << "waves vs lake: " << c.compare(input) << endl;
+
+ // Read an image and compare it with reference
+ input= cv::imread("../fundy.jpg");
+ cout << "waves vs fundy: " << c.compare(input) << endl;
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 04/retrieve.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 05/morpho2.cpp
===================================================================
--- Chapter 05/morpho2.cpp (revision 0)
+++ Chapter 05/morpho2.cpp (revision 3)
@@ -0,0 +1,125 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 5 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include "morphoFeatures.h"
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../building.jpg",0);
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Image");
+ cv::imshow("Image",image);
+
+ // Create the morphological features instance
+ MorphoFeatures morpho;
+ morpho.setThreshold(40);
+
+ // Get the edges
+ cv::Mat edges;
+ edges= morpho.getEdges(image);
+
+ // Display the edge image
+ cv::namedWindow("Edge Image");
+ cv::imshow("Edge Image",edges);
+
+ // Get the corners
+ morpho.setThreshold(-1);
+ cv::Mat corners;
+ corners= morpho.getCorners(image);
+ cv::morphologyEx(corners,corners,cv::MORPH_TOPHAT,cv::Mat());
+ cv::threshold(corners, corners, 40, 255, cv::THRESH_BINARY_INV);
+
+ // Display the corner image
+ cv::namedWindow("Corner Image");
+ cv::imshow("Corner Image",corners);
+
+ // Display the corner on the image
+ morpho.drawOnImage(corners,image);
+ cv::namedWindow("Corners on Image");
+ cv::imshow("Corners on Image",image);
+
+ // Read and display image of square
+ image= cv::imread("../square.bmp",0);
+ cv::namedWindow("Square Image");
+ cv::imshow("Square Image",image);
+
+ // Creating the cross-shaped structuring element
+ cv::Mat cross(5,5,CV_8U,cv::Scalar(0));
+ for (int i=0; i<5; i++) {
+
+ cross.at<uchar>(2,i)= 1;
+ cross.at<uchar>(i,2)= 1;
+ }
+
+ // Dilate with a cross
+ cv::Mat result;
+ cv::dilate(image,result,cross);
+
+ // Display the result
+ cv::namedWindow("Dilated square with cross");
+ cv::imshow("Dilated square with cross",result);
+
+ // Creating the diamond-shaped structuring element
+ cv::Mat diamond(5,5,CV_8U,cv::Scalar(1));
+ diamond.at<uchar>(0,0)= 0;
+ diamond.at<uchar>(0,1)= 0;
+ diamond.at<uchar>(1,0)= 0;
+ diamond.at<uchar>(4,4)= 0;
+ diamond.at<uchar>(3,4)= 0;
+ diamond.at<uchar>(4,3)= 0;
+ diamond.at<uchar>(4,0)= 0;
+ diamond.at<uchar>(4,1)= 0;
+ diamond.at<uchar>(3,0)= 0;
+ diamond.at<uchar>(0,4)= 0;
+ diamond.at<uchar>(0,3)= 0;
+ diamond.at<uchar>(1,4)= 0;
+
+ // Erode with a diamond
+ cv::Mat result2;
+ cv::erode(result,result2,diamond);
+
+ // Display the result
+ cv::namedWindow("Eroded square with diamond");
+ cv::imshow("Eroded square with diamond",result2);
+
+ // Combine the images into one
+ cv::Mat final(100,300,CV_8U);
+ cv::Mat window= final(cv::Rect(0,0,100,100));
+ image.copyTo(window);
+ window= final(cv::Rect(100,0,100,100));
+ result.copyTo(window);
+ window= final(cv::Rect(200,0,100,100));
+ result2.copyTo(window);
+
+ // Display the combined result
+ cv::namedWindow("Combined");
+ cv::imshow("Combined",final);
+
+ // Save combined result
+ cv::imwrite("squares.bmp",final);
+
+ cv::waitKey();
+
+ return 0;
+}
/Chapter 05/morpho2.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 05/morphoFeatures.h
===================================================================
--- Chapter 05/morphoFeatures.h (revision 0)
+++ Chapter 05/morphoFeatures.h (revision 3)
@@ -0,0 +1,142 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 5 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined MORPHOF
+#define MORPHOF
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+
+class MorphoFeatures {
+
+ private:
+
+ // threshold to produce binary image
+ int threshold;
+ // structuring elements used in corner detection
+ cv::Mat cross;
+ cv::Mat diamond;
+ cv::Mat square;
+ cv::Mat x;
+
+ void applyThreshold(cv::Mat& result) {
+
+ // Apply threshold on result
+ if (threshold>0)
+ cv::threshold(result, result, threshold, 255, cv::THRESH_BINARY_INV);
+ }
+
+ public:
+
+ MorphoFeatures() : threshold(-1), cross(5,5,CV_8U,cv::Scalar(0)),
+ diamond(5,5,CV_8U,cv::Scalar(1)),
+ square(5,5,CV_8U,cv::Scalar(1)),
+ x(5,5,CV_8U,cv::Scalar(0)){
+
+ // Creating the cross-shaped structuring element
+ for (int i=0; i<5; i++) {
+
+ cross.at<uchar>(2,i)= 1;
+ cross.at<uchar>(i,2)= 1;
+ }
+
+ // Creating the diamond-shaped structuring element
+ diamond.at<uchar>(0,0)= 0;
+ diamond.at<uchar>(0,1)= 0;
+ diamond.at<uchar>(1,0)= 0;
+ diamond.at<uchar>(4,4)= 0;
+ diamond.at<uchar>(3,4)= 0;
+ diamond.at<uchar>(4,3)= 0;
+ diamond.at<uchar>(4,0)= 0;
+ diamond.at<uchar>(4,1)= 0;
+ diamond.at<uchar>(3,0)= 0;
+ diamond.at<uchar>(0,4)= 0;
+ diamond.at<uchar>(0,3)= 0;
+ diamond.at<uchar>(1,4)= 0;
+
+ // Creating the x-shaped structuring element
+ for (int i=0; i<5; i++) {
+
+ x.at<uchar>(i,i)= 1;
+ x.at<uchar>(4-i,i)= 1;
+ }
+ }
+
+ void setThreshold(int t) {
+
+ threshold= t;
+ }
+
+ int getThreshold() const {
+
+ return threshold;
+ }
+
+ cv::Mat getEdges(const cv::Mat &image) {
+
+ // Get the gradient image
+ cv::Mat result;
+ cv::morphologyEx(image,result,cv::MORPH_GRADIENT,cv::Mat());
+
+ // Apply threshold to obtain a binary image
+ applyThreshold(result);
+
+ return result;
+ }
+
+ cv::Mat getCorners(const cv::Mat &image) {
+
+ cv::Mat result;
+
+ // Dilate with a cross
+ cv::dilate(image,result,cross);
+
+ // Erode with a diamond
+ cv::erode(result,result,diamond);
+
+ cv::Mat result2;
+ // Dilate with a X
+ cv::dilate(image,result2,x);
+
+ // Erode with a square
+ cv::erode(result2,result2,square);
+
+ // Corners are obtained by differencing
+ // the two closed images
+ cv::absdiff(result2,result,result);
+
+ // Apply threshold to obtain a binary image
+ applyThreshold(result);
+
+ return result;
+ }
+
+ void drawOnImage(const cv::Mat& binary, cv::Mat& image) {
+
+ cv::Mat_<uchar>::const_iterator it= binary.begin<uchar>();
+ cv::Mat_<uchar>::const_iterator itend= binary.end<uchar>();
+
+ // for each pixel
+ for (int i=0; it!= itend; ++it,++i) {
+ if (!*it)
+ cv::circle(image,cv::Point(i%image.step,i/image.step),5,cv::Scalar(255,0,0));
+ }
+ }
+};
+
+
+#endif
/Chapter 05/morphoFeatures.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 05/watershedSegmentation.h
===================================================================
--- Chapter 05/watershedSegmentation.h (revision 0)
+++ Chapter 05/watershedSegmentation.h (revision 3)
@@ -0,0 +1,68 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 5 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined WATERSHS
+#define WATERSHS
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+
+class WatershedSegmenter {
+
+ private:
+
+ cv::Mat markers;
+
+ public:
+
+ void setMarkers(const cv::Mat& markerImage) {
+
+ // Convert to image of ints
+ markerImage.convertTo(markers,CV_32S);
+ }
+
+ cv::Mat process(const cv::Mat &image) {
+
+ // Apply watershed
+ cv::watershed(image,markers);
+
+ return markers;
+ }
+
+ // Return result in the form of an image
+ cv::Mat getSegmentation() {
+
+ cv::Mat tmp;
+ // all segment with label higher than 255
+ // will be assigned value 255
+ markers.convertTo(tmp,CV_8U);
+
+ return tmp;
+ }
+
+ // Return watershed in the form of an image
+ cv::Mat getWatersheds() {
+
+ cv::Mat tmp;
+ markers.convertTo(tmp,CV_8U,255,255);
+
+ return tmp;
+ }
+};
+
+
+#endif
/Chapter 05/watershedSegmentation.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 05/README.txt
===================================================================
--- Chapter 05/README.txt (revision 0)
+++ Chapter 05/README.txt (revision 3)
@@ -0,0 +1,21 @@
+This directory contains material supporting chapter 5 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+File:
+ morphology.cpp
+correspond to Recipes:
+Eroding and Dilating Images using Morphological Filters
+Opening and Closing Images using Morphological Filters
+
+Files:
+ morpho2.cpp
+ morphoFeatures.h
+correspond to Recipe:
+Detecting edges and corners using morphological filters
+
+Files:
+ segment.cpp
+ watershedSegmentation.h
+correspond to Recipe:
+Segmenting images using watersheds
\ No newline at end of file
/Chapter 05/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 05/morphology.cpp
===================================================================
--- Chapter 05/morphology.cpp (revision 0)
+++ Chapter 05/morphology.cpp (revision 3)
@@ -0,0 +1,104 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 5 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../binary.bmp");
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Image");
+ cv::imshow("Image",image);
+
+ // Erode the image
+ cv::Mat eroded;
+ cv::erode(image,eroded,cv::Mat());
+
+ // Display the eroded image
+ cv::namedWindow("Eroded Image");
+ cv::imshow("Eroded Image",eroded);
+
+ // Dilate the image
+ cv::Mat dilated;
+ cv::dilate(image,dilated,cv::Mat());
+
+ // Display the dialted image
+ cv::namedWindow("Dilated Image");
+ cv::imshow("Dilated Image",dilated);
+
+ // Erode the image with a larger s.e.
+ cv::Mat element(7,7,CV_8U,cv::Scalar(1));
+ cv::erode(image,eroded,element);
+
+ // Display the eroded image
+ cv::namedWindow("Eroded Image (7x7)");
+ cv::imshow("Eroded Image (7x7)",eroded);
+
+ // Erode the image 3 times.
+ cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);
+
+ // Display the eroded image
+ cv::namedWindow("Eroded Image (3 times)");
+ cv::imshow("Eroded Image (3 times)",eroded);
+
+ // Close the image
+ cv::Mat element5(5,5,CV_8U,cv::Scalar(1));
+ cv::Mat closed;
+ cv::morphologyEx(image,closed,cv::MORPH_CLOSE,element5);
+
+ // Display the opened image
+ cv::namedWindow("Closed Image");
+ cv::imshow("Closed Image",closed);
+
+ // Open the image
+ cv::Mat opened;
+ cv::morphologyEx(image,opened,cv::MORPH_OPEN,element5);
+
+ // Display the opened image
+ cv::namedWindow("Opened Image");
+ cv::imshow("Opened Image",opened);
+
+ // Close and Open the image
+ cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);
+ cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);
+
+ // Display the close/opened image
+ cv::namedWindow("Closed and Opened Image");
+ cv::imshow("Closed and Opened Image",image);
+ cv::imwrite("binaryGroup.bmp",image);
+
+ // Read input image
+ image= cv::imread("../binary.bmp");
+
+ // Open and Close the image
+ cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);
+ cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);
+
+ // Display the close/opened image
+ cv::namedWindow("Opened and Closed Image");
+ cv::imshow("Opened and Closed Image",image);
+
+ cv::waitKey();
+ return 0;
+}
+
/Chapter 05/morphology.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 05/segment.cpp
===================================================================
--- Chapter 05/segment.cpp (revision 0)
+++ Chapter 05/segment.cpp (revision 3)
@@ -0,0 +1,167 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 5 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include "watershedSegmentation.h"
+
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../group.jpg");
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Original Image");
+ cv::imshow("Original Image",image);
+
+ // Get the binary map
+ cv::Mat binary;
+ binary= cv::imread("../binary.bmp",0);
+
+ // Display the binary image
+ cv::namedWindow("Binary Image");
+ cv::imshow("Binary Image",binary);
+
+ // Eliminate noise and smaller objects
+ cv::Mat fg;
+ cv::erode(binary,fg,cv::Mat(),cv::Point(-1,-1),6);
+
+ // Display the foreground image
+ cv::namedWindow("Foreground Image");
+ cv::imshow("Foreground Image",fg);
+
+ // Identify image pixels without objects
+ cv::Mat bg;
+ cv::dilate(binary,bg,cv::Mat(),cv::Point(-1,-1),6);
+ cv::threshold(bg,bg,1,128,cv::THRESH_BINARY_INV);
+
+ // Display the background image
+ cv::namedWindow("Background Image");
+ cv::imshow("Background Image",bg);
+
+ // Show markers image
+ cv::Mat markers(binary.size(),CV_8U,cv::Scalar(0));
+ markers= fg+bg;
+ cv::namedWindow("Markers");
+ cv::imshow("Markers",markers);
+
+ // Create watershed segmentation object
+ WatershedSegmenter segmenter;
+
+ // Set markers and process
+ segmenter.setMarkers(markers);
+ segmenter.process(image);
+
+ // Display segmentation result
+ cv::namedWindow("Segmentation");
+ cv::imshow("Segmentation",segmenter.getSegmentation());
+
+ // Display watersheds
+ cv::namedWindow("Watersheds");
+ cv::imshow("Watersheds",segmenter.getWatersheds());
+
+ // Open another image
+ image= cv::imread("../tower.jpg");
+
+ // Identify background pixels
+ cv::Mat imageMask(image.size(),CV_8U,cv::Scalar(0));
+ cv::rectangle(imageMask,cv::Point(5,5),cv::Point(image.cols-5,image.rows-5),cv::Scalar(255),3);
+ // Identify foreground pixels (in the middle of the image)
+ cv::rectangle(imageMask,cv::Point(image.cols/2-10,image.rows/2-10),
+ cv::Point(image.cols/2+10,image.rows/2+10),cv::Scalar(1),10);
+
+ // Set markers and process
+ segmenter.setMarkers(imageMask);
+ segmenter.process(image);
+
+ // Display the image with markers
+ cv::rectangle(image,cv::Point(5,5),cv::Point(image.cols-5,image.rows-5),cv::Scalar(255,255,255),3);
+ cv::rectangle(image,cv::Point(image.cols/2-10,image.rows/2-10),
+ cv::Point(image.cols/2+10,image.rows/2+10),cv::Scalar(1,1,1),10);
+ cv::namedWindow("Image with marker");
+ cv::imshow("Image with marker",image);
+
+ // Display watersheds
+ cv::namedWindow("Watersheds of foreground object");
+ cv::imshow("Watersheds of foreground object",segmenter.getWatersheds());
+
+ // Open another image
+ image= cv::imread("../tower.jpg");
+
+ // define bounding rectangle
+ cv::Rect rectangle(50,70,image.cols-150,image.rows-180);
+
+ cv::Mat result; // segmentation result (4 possible values)
+ cv::Mat bgModel,fgModel; // the models (internally used)
+ // GrabCut segmentation
+ cv::grabCut(image, // input image
+ result, // segmentation result
+ rectangle,// rectangle containing foreground
+ bgModel,fgModel, // models
+ 1, // number of iterations
+ cv::GC_INIT_WITH_RECT); // use rectangle
+
+ // Get the pixels marked as likely foreground
+ cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
+ // Generate output image
+ cv::Mat foreground(image.size(),CV_8UC3,cv::Scalar(255,255,255));
+ image.copyTo(foreground,result); // bg pixels not copied
+
+ // draw rectangle on original image
+ cv::rectangle(image, rectangle, cv::Scalar(255,255,255),1);
+ cv::namedWindow("Image");
+ cv::imshow("Image",image);
+
+ // display result
+ cv::namedWindow("Segmented Image");
+ cv::imshow("Segmented Image",foreground);
+
+ // Open another image
+ image= cv::imread("../group.jpg");
+
+ // define bounding rectangle
+ cv::Rect rectangle2(10,100,380,180);
+
+ cv::Mat bkgModel,fgrModel; // the models (internally used)
+ // GrabCut segmentation
+ cv::grabCut(image, // input image
+ result, // segmentation result
+ rectangle2,bkgModel,fgrModel,5,cv::GC_INIT_WITH_RECT);
+ // Get the pixels marked as likely foreground
+// cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
+ result= result&1;
+ foreground.create(image.size(),CV_8UC3);
+ foreground.setTo(cv::Scalar(255,255,255));
+ image.copyTo(foreground,result); // bg pixels not copied
+
+ // draw rectangle on original image
+ cv::rectangle(image, rectangle2, cv::Scalar(255,255,255),1);
+ cv::namedWindow("Image 2");
+ cv::imshow("Image 2",image);
+
+ // display result
+ cv::namedWindow("Foreground objects");
+ cv::imshow("Foreground objects",foreground);
+
+ cv::waitKey();
+ return 0;
+}
/Chapter 05/segment.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 06/derivatives.cpp
===================================================================
--- Chapter 06/derivatives.cpp (revision 0)
+++ Chapter 06/derivatives.cpp (revision 3)
@@ -0,0 +1,181 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 6 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <iomanip>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include "laplacianZC.h"
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../boldt.jpg",0);
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Original Image");
+ cv::imshow("Original Image",image);
+
+ // Compute Sobel X derivative
+ cv::Mat sobelX;
+ cv::Sobel(image,sobelX,CV_8U,1,0,3,0.4,128);
+
+ // Display the image
+ cv::namedWindow("Sobel X Image");
+ cv::imshow("Sobel X Image",sobelX);
+
+ // Compute Sobel Y derivative
+ cv::Mat sobelY;
+ cv::Sobel(image,sobelY,CV_8U,0,1,3,0.4,128);
+
+ // Display the image
+ cv::namedWindow("Sobel Y Image");
+ cv::imshow("Sobel Y Image",sobelY);
+
+ // Compute norm of Sobel
+ cv::Sobel(image,sobelX,CV_16S,1,0);
+ cv::Sobel(image,sobelY,CV_16S,0,1);
+ cv::Mat sobel;
+ //compute the L1 norm
+ sobel= abs(sobelX)+abs(sobelY);
+
+ double sobmin, sobmax;
+ cv::minMaxLoc(sobel,&sobmin,&sobmax);
+ std::cout << "sobel value range: " << sobmin << " " << sobmax << std::endl;
+
+ // Print window pixel values
+ for (int i=0; i<12; i++) {
+ for (int j=0; j<12; j++)
+ std::cout << std::setw(5) << static_cast<int>(sobel.at<short>(i+135,j+362)) << " ";
+ std::cout << std::endl;
+ }
+ std::cout << std::endl;
+ std::cout << std::endl;
+ std::cout << std::endl;
+
+ // Conversion to 8-bit image
+ // sobelImage = -alpha*sobel + 255
+ cv::Mat sobelImage;
+ sobel.convertTo(sobelImage,CV_8U,-255./sobmax,255);
+
+ // Display the image
+ cv::namedWindow("Sobel Image");
+ cv::imshow("Sobel Image",sobelImage);
+
+ // Apply threshold to Sobel norm (low threshold value)
+ cv::Mat sobelThresholded;
+ cv::threshold(sobelImage, sobelThresholded, 225, 255, cv::THRESH_BINARY);
+
+ // Display the image
+ cv::namedWindow("Binary Sobel Image (low)");
+ cv::imshow("Binary Sobel Image (low)",sobelThresholded);
+
+ // Apply threshold to Sobel norm (high threshold value)
+ cv::threshold(sobelImage, sobelThresholded, 190, 255, cv::THRESH_BINARY);
+
+ // Display the image
+ cv::namedWindow("Binary Sobel Image (high)");
+ cv::imshow("Binary Sobel Image (high)",sobelThresholded);
+
+ // Compute Laplacian 3x3
+ cv::Mat laplace;
+ cv::Laplacian(image,laplace,CV_8U,1,1,128);
+
+ // Display the image
+ cv::namedWindow("Laplacian Image");
+ cv::imshow("Laplacian Image",laplace);
+
+ // Print window pixel values
+ for (int i=0; i<12; i++) {
+ for (int j=0; j<12; j++)
+ std::cout << std::setw(5) << static_cast<int>(laplace.at<uchar>(i+135,j+362))-128 << " ";
+ std::cout << std::endl;
+ }
+ std::cout << std::endl;
+ std::cout << std::endl;
+ std::cout << std::endl;
+
+ // Compute Laplacian 7x7
+ cv::Laplacian(image,laplace,CV_8U,7,0.01,128);
+
+ // Display the image
+ cv::namedWindow("Laplacian Image");
+ cv::imshow("Laplacian Image",laplace);
+
+ // Print window pixel values
+ for (int i=0; i<12; i++) {
+ for (int j=0; j<12; j++)
+ std::cout << std::setw(5) << static_cast<int>(laplace.at<uchar>(i+135,j+362))-128 << " ";
+ std::cout << std::endl;
+ }
+
+ // Extract small window
+ cv::Mat window(image,cv::Rect(362,135,12,12));
+ cv::namedWindow("Image window");
+ cv::imshow("Image window",window);
+ cv::imwrite("window.bmp",window);
+
+ // Compute Laplacian using LaplacianZC class
+ LaplacianZC laplacian;
+ laplacian.setAperture(7);
+ cv::Mat flap= laplacian.computeLaplacian(image);
+ double lapmin, lapmax;
+ cv::minMaxLoc(flap,&lapmin,&lapmax);
+ std::cout << "Laplacian value range=[" << lapmin << "," << lapmax << "]\n";
+ laplace= laplacian.getLaplacianImage();
+ cv::namedWindow("Laplacian Image (7x7)");
+ cv::imshow("Laplacian Image (7x7)",laplace);
+
+ // Print Laplacian values
+ std::cout << std::endl;
+ for (int i=0; i<12; i++) {
+ for (int j=0; j<12; j++)
+ std::cout << std::setw(5) << static_cast<int>(flap.at<float>(i+135,j+362)/100) << " ";
+ std::cout << std::endl;
+ }
+ std::cout << std::endl;
+
+ // Compute and display the zero-crossing points
+ cv::Mat zeros;
+ zeros= laplacian.getZeroCrossings(lapmax);
+ cv::namedWindow("Zero-crossings");
+ cv::imshow("Zero-crossings",zeros);
+
+ // Compute and display the zero-crossing points (Sobel version)
+ zeros= laplacian.getZeroCrossings();
+ zeros= laplacian.getZeroCrossingsWithSobel(50);
+ cv::namedWindow("Zero-crossings (2)");
+ cv::imshow("Zero-crossings (2)",zeros);
+
+ // Print window pixel values
+ for (int i=0; i<12; i++) {
+ for (int j=0; j<12; j++)
+ std::cout << std::setw(2) << static_cast<int>(zeros.at<uchar>(i+135,j+362)) << " ";
+ std::cout << std::endl;
+ }
+
+ // Display the image with window
+ cv::rectangle(image,cv::Point(362,135),cv::Point(374,147),cv::Scalar(255,255,255));
+ cv::namedWindow("Original Image with window");
+ cv::imshow("Original Image with window",image);
+
+ cv::waitKey();
+ return 0;
+}
/Chapter 06/derivatives.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 06/laplacianZC.h
===================================================================
--- Chapter 06/laplacianZC.h (revision 0)
+++ Chapter 06/laplacianZC.h (revision 3)
@@ -0,0 +1,154 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 6 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined LAPLACEZC
+#define LAPLACEZC
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+
+class LaplacianZC {
+
+ private:
+
+ // original image
+ cv::Mat img;
+
+ // 32-bit float image containing the Laplacian
+ cv::Mat laplace;
+ // Aperture size of the laplacian kernel
+ int aperture;
+
+ public:
+
+ LaplacianZC() : aperture(3) {}
+
+ // Set the aperture size of the kernel
+ void setAperture(int a) {
+
+ aperture= a;
+ }
+
+ // Get the aperture size of the kernel
+ int getAperture() const {
+
+ return aperture;
+ }
+
+ // Compute the floating point Laplacian
+ cv::Mat computeLaplacian(const cv::Mat& image) {
+
+
+ // Compute Laplacian
+ cv::Laplacian(image,laplace,CV_32F,aperture);
+
+ // Keep local copy of the image
+ // (used for zero-crossings)
+ img= image.clone();
+
+ return laplace;
+ }
+
+ // Get the Laplacian result in 8-bit image
+ // zero corresponds to gray level 128
+ // if no scale is provided, then the max value will be
+ // scaled to intensity 255
+ // You must call computeLaplacian before calling this method
+ cv::Mat getLaplacianImage(double scale=-1.0) {
+
+ if (scale<0) {
+
+ double lapmin, lapmax;
+ cv::minMaxLoc(laplace,&lapmin,&lapmax);
+
+ scale= 127/ std::max(-lapmin,lapmax);
+ }
+
+ cv::Mat laplaceImage;
+ laplace.convertTo(laplaceImage,CV_8U,scale,128);
+
+ return laplaceImage;
+ }
+
+ // Get a binary image of the zero-crossings
+ // if the product of the two adjascent pixels is
+ // less than threshold then this zero-crossing will be ignored
+ cv::Mat getZeroCrossings(float threshold=1.0) {
+
+ // Create the iterators
+ cv::Mat_<float>::const_iterator it= laplace.begin<float>()+laplace.step1();
+ cv::Mat_<float>::const_iterator itend= laplace.end<float>();
+ cv::Mat_<float>::const_iterator itup= laplace.begin<float>();
+
+ // Binary image initialize to white
+ cv::Mat binary(laplace.size(),CV_8U,cv::Scalar(255));
+ cv::Mat_<uchar>::iterator itout= binary.begin<uchar>()+binary.step1();
+
+ // negate the input threshold value
+ threshold *= -1.0;
+
+ for ( ; it!= itend; ++it, ++itup, ++itout) {
+
+ // if the product of two adjascent pixel is negative
+ // then there is a sign change
+ if (*it * *(it-1) < threshold)
+ *itout= 0; // horizontal zero-crossing
+ else if (*it * *itup < threshold)
+ *itout= 0; // vertical zero-crossing
+ }
+
+ return binary;
+ }
+
+ // Get a binary image of the zero-crossings
+ // if the product of the two adjacent pixels is
+ // less than threshold then this zero-crossing will be ignored
+ cv::Mat getZeroCrossingsWithSobel(float threshold) {
+
+ cv::Mat sx;
+ cv::Sobel(img,sx,CV_32F,1,0,1);
+ cv::Mat sy;
+ cv::Sobel(img,sy,CV_32F,0,1,1);
+
+ // Create the iterators
+ cv::Mat_<float>::const_iterator it= laplace.begin<float>()+laplace.step1();
+ cv::Mat_<float>::const_iterator itend= laplace.end<float>();
+ cv::Mat_<float>::const_iterator itup= laplace.begin<float>();
+ cv::Mat_<float>::const_iterator itx= sx.begin<float>()+sx.step1();
+ cv::Mat_<float>::const_iterator ity= sy.begin<float>()+sy.step1();
+
+ // Binary image initialize to white
+ cv::Mat binary(laplace.size(),CV_8U,cv::Scalar(255));
+ cv::Mat_<uchar>::iterator itout= binary.begin<uchar>()+binary.step1();
+
+ for ( ; it!= itend; ++it, ++itup, ++itout, ++itx, ++ity) {
+
+ // if the product of two adjacent pixel is negative
+ // then there is a sign change
+ if (*it * *(it-1) < 0.0 && fabs(*ity) > threshold)
+ *itout= 0; // horizontal zero-crossing
+ else if (*it * *itup < 0.0 && fabs(*ity) > threshold)
+ *itout= 0; // vertical zero-crossing
+ }
+
+ return binary;
+ }
+
+};
+
+
+#endif
/Chapter 06/laplacianZC.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 06/filters.cpp
===================================================================
--- Chapter 06/filters.cpp (revision 0)
+++ Chapter 06/filters.cpp (revision 3)
@@ -0,0 +1,135 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 6 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../boldt.jpg",0);
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Original Image");
+ cv::imshow("Original Image",image);
+
+ // Blur the image
+ cv::Mat result;
+ cv::GaussianBlur(image,result,cv::Size(5,5),1.5);
+
+ // Display the blurred image
+ cv::namedWindow("Gaussian filtered Image");
+ cv::imshow("Gaussian filtered Image",result);
+
+ // Get the gaussian kernel (1.5)
+ cv::Mat gauss= cv::getGaussianKernel(9,1.5,CV_32F);
+
+ // Display kernel values
+ cv::Mat_<float>::const_iterator it= gauss.begin<float>();
+ cv::Mat_<float>::const_iterator itend= gauss.end<float>();
+ std::cout << "[";
+ for ( ; it!= itend; ++it) {
+ std::cout << *it << " ";
+ }
+ std::cout << "]" << std::endl;
+
+ // Get the gaussian kernel (0.5)
+ gauss= cv::getGaussianKernel(9,0.5,CV_32F);
+
+ // Display kernel values
+ it= gauss.begin<float>();
+ itend= gauss.end<float>();
+ std::cout << "[";
+ for ( ; it!= itend; ++it) {
+ std::cout << *it << " ";
+ }
+ std::cout << "]" << std::endl;
+
+ // Get the gaussian kernel (2.5)
+ gauss= cv::getGaussianKernel(9,2.5,CV_32F);
+
+ // Display kernel values
+ it= gauss.begin<float>();
+ itend= gauss.end<float>();
+ std::cout << "[";
+ for ( ; it!= itend; ++it) {
+ std::cout << *it << " ";
+ }
+ std::cout << "]" << std::endl;
+
+ // Get the Deriv kernel (2.5)
+ cv::Mat kx, ky;
+ cv::getDerivKernels(kx,ky,2,2,7,true);
+
+ // Display kernel values
+ cv::Mat_<float>::const_iterator kit= kx.begin<float>();
+ cv::Mat_<float>::const_iterator kitend= kx.end<float>();
+ std::cout << "[";
+ for ( ; kit!= kitend; ++kit) {
+ std::cout << *kit << " ";
+ }
+ std::cout << "]" << std::endl;
+
+ // Blur the image with a mean filter
+ cv::blur(image,result,cv::Size(5,5));
+
+ // Display the blurred image
+ cv::namedWindow("Mean filtered Image");
+ cv::imshow("Mean filtered Image",result);
+
+ // Read input image with salt&pepper noise
+ image= cv::imread("../salted.bmp",0);
+ if (!image.data)
+ return 0;
+
+ // Display the S&P image
+ cv::namedWindow("S&P Image");
+ cv::imshow("S&P Image",image);
+
+ // Blur the image with a mean filter
+ cv::blur(image,result,cv::Size(5,5));
+
+ // Display the blurred image
+ cv::namedWindow("Mean filtered S&P Image");
+ cv::imshow("Mean filtered S&P Image",result);
+
+ // Applying a median filter
+ cv::medianBlur(image,result,5);
+
+ // Display the blurred image
+ cv::namedWindow("Median filtered S&P Image");
+ cv::imshow("Median filtered S&P Image",result);
+
+ // Reduce by 4 the size of the image (the wrong way)
+ image= cv::imread("../boldt.jpg",0);
+ cv::Mat reduced(image.rows/2,image.cols/2,CV_8U);
+
+ for (int i=0; i<reduced.rows; i++)
+ for (int j=0; j<reduced.cols; j++)
+ reduced.at<uchar>(i,j)= image.at<uchar>(i*2,j*2);
+
+ // Display the reduced image
+ cv::namedWindow("Badly reduced Image");
+ cv::imshow("Badly reduced Image",reduced);
+
+ cv::waitKey();
+ return 0;
+}
/Chapter 06/filters.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 06/README.txt
===================================================================
--- Chapter 06/README.txt (revision 0)
+++ Chapter 06/README.txt (revision 3)
@@ -0,0 +1,16 @@
+This directory contains material supporting chapter 6 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+File:
+ filters.cpp
+correspond to Recipes:
+Filtering Images using Low-pass Filters
+Filtering Images using a Median Filter
+
+Files:
+ dderivatives.cpp
+ laplacianZC.h
+correspond to Recipes:
+Applying Directional Filters to Detect Edges
+Computing the Laplacian of an Image
/Chapter 06/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 07/blobs.cpp
===================================================================
--- Chapter 07/blobs.cpp (revision 0)
+++ Chapter 07/blobs.cpp (revision 3)
@@ -0,0 +1,169 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 7 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+int main()
+{
+ // Read input binary image
+ cv::Mat image= cv::imread("../binaryGroup.bmp",0);
+ if (!image.data)
+ return 0;
+
+ cv::namedWindow("Binary Image");
+ cv::imshow("Binary Image",image);
+
+ // Get the contours of the connected components
+ std::vector<std::vector<cv::Point>> contours;
+ cv::findContours(image,
+ contours, // a vector of contours
+ CV_RETR_EXTERNAL, // retrieve the external contours
+ CV_CHAIN_APPROX_NONE); // retrieve all pixels of each contours
+
+ // Print contours' length
+ std::cout << "Contours: " << contours.size() << std::endl;
+ std::vector<std::vector<cv::Point>>::const_iterator itContours= contours.begin();
+ for ( ; itContours!=contours.end(); ++itContours) {
+
+ std::cout << "Size: " << itContours->size() << std::endl;
+ }
+
+ // draw black contours on white image
+ cv::Mat result(image.size(),CV_8U,cv::Scalar(255));
+ cv::drawContours(result,contours,
+ -1, // draw all contours
+ cv::Scalar(0), // in black
+ 2); // with a thickness of 2
+
+ cv::namedWindow("Contours");
+ cv::imshow("Contours",result);
+
+ // Eliminate too short or too long contours
+ int cmin= 100; // minimum contour length
+ int cmax= 1000; // maximum contour length
+ std::vector<std::vector<cv::Point>>::const_iterator itc= contours.begin();
+ while (itc!=contours.end()) {
+
+ if (itc->size() < cmin || itc->size() > cmax)
+ itc= contours.erase(itc);
+ else
+ ++itc;
+ }
+
+ // draw contours on the original image
+ cv::Mat original= cv::imread("../group.jpg");
+ cv::drawContours(original,contours,
+ -1, // draw all contours
+ cv::Scalar(255,255,255), // in white
+ 2); // with a thickness of 2
+
+ cv::namedWindow("Contours on Animals");
+ cv::imshow("Contours on Animals",original);
+
+ // Let's now draw black contours on white image
+ result.setTo(cv::Scalar(255));
+ cv::drawContours(result,contours,
+ -1, // draw all contours
+ cv::Scalar(0), // in black
+ 1); // with a thickness of 1
+ image= cv::imread("../binaryGroup.bmp",0);
+
+ // testing the bounding box
+ cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));
+ cv::rectangle(result,r0,cv::Scalar(0),2);
+
+ // testing the enclosing circle
+ float radius;
+ cv::Point2f center;
+ cv::minEnclosingCircle(cv::Mat(contours[1]),center,radius);
+ cv::circle(result,cv::Point(center),static_cast<int>(radius),cv::Scalar(0),2);
+
+// cv::RotatedRect rrect= cv::fitEllipse(cv::Mat(contours[1]));
+// cv::ellipse(result,rrect,cv::Scalar(0),2);
+
+ // testing the approximate polygon
+ std::vector<cv::Point> poly;
+ cv::approxPolyDP(cv::Mat(contours[2]),poly,5,true);
+
+ std::cout << "Polygon size: " << poly.size() << std::endl;
+
+ // Iterate over each segment and draw it
+ std::vector<cv::Point>::const_iterator itp= poly.begin();
+ while (itp!=(poly.end()-1)) {
+ cv::line(result,*itp,*(itp+1),cv::Scalar(0),2);
+ ++itp;
+ }
+ // last point linked to first point
+ cv::line(result,*(poly.begin()),*(poly.end()-1),cv::Scalar(20),2);
+
+ // testing the convex hull
+ std::vector<cv::Point> hull;
+ cv::convexHull(cv::Mat(contours[3]),hull);
+
+ // Iterate over each segment and draw it
+ std::vector<cv::Point>::const_iterator it= hull.begin();
+ while (it!=(hull.end()-1)) {
+ cv::line(result,*it,*(it+1),cv::Scalar(0),2);
+ ++it;
+ }
+ // last point linked to first point
+ cv::line(result,*(hull.begin()),*(hull.end()-1),cv::Scalar(20),2);
+
+ // testing the moments
+
+ // iterate over all contours
+ itc= contours.begin();
+ while (itc!=contours.end()) {
+
+ // compute all moments
+ cv::Moments mom= cv::moments(cv::Mat(*itc++));
+
+ // draw mass center
+ cv::circle(result,
+ // position of mass center converted to integer
+ cv::Point(mom.m10/mom.m00,mom.m01/mom.m00),
+ 2,cv::Scalar(0),2); // draw black dot
+ }
+
+ cv::namedWindow("Some Shape descriptors");
+ cv::imshow("Some Shape descriptors",result);
+
+ // New call to findContours but with CV_RETR_LIST flag
+ image= cv::imread("../binaryGroup.bmp",0);
+
+ // Get the contours of the connected components
+ cv::findContours(image,
+ contours, // a vector of contours
+ CV_RETR_LIST, // retrieve the external and internal contours
+ CV_CHAIN_APPROX_NONE); // retrieve all pixels of each contours
+
+ // draw black contours on white image
+ result.setTo(cv::Scalar(255));
+ cv::drawContours(result,contours,
+ -1, // draw all contours
+ cv::Scalar(0), // in black
+ 2); // with a thickness of 2
+ cv::namedWindow("All Contours");
+ cv::imshow("All Contours",result);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 07/blobs.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 07/edgedetector.h
===================================================================
--- Chapter 07/edgedetector.h (revision 0)
+++ Chapter 07/edgedetector.h (revision 3)
@@ -0,0 +1,121 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 6 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined SOBELEDGES
+#define SOBELEDGES
+
+#define PI 3.1415926
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+
+class EdgeDetector {
+
+ private:
+
+ // original image
+ cv::Mat img;
+
+ // 16-bit signed int image
+ cv::Mat sobel;
+
+ // Aperture size of the Sobel kernel
+ int aperture;
+
+ // Sobel magnitude
+ cv::Mat sobelMagnitude;
+
+ // Sobel orientation
+ cv::Mat sobelOrientation;
+
+ public:
+
+ EdgeDetector() : aperture(3) {}
+
+ // Set the aperture size of the kernel
+ void setAperture(int a) {
+
+ aperture= a;
+ }
+
+ // Get the aperture size of the kernel
+ int getAperture() const {
+
+ return aperture;
+ }
+
+ // Compute the Sobel
+ void computeSobel(const cv::Mat& image, cv::Mat &sobelX=cv::Mat(), cv::Mat &sobelY=cv::Mat()) {
+
+ // Compute Sobel
+ cv::Sobel(image,sobelX,CV_32F,1,0,aperture);
+ cv::Sobel(image,sobelY,CV_32F,0,1,aperture);
+
+ // Compute magnitude and orientation
+ cv::cartToPolar(sobelX,sobelY,sobelMagnitude,sobelOrientation);
+ }
+
+ // Get Sobel magnitude
+ // Make a copy if called more than once
+ cv::Mat getMagnitude() {
+
+ return sobelMagnitude;
+ }
+
+ // Get Sobel orientation
+ // Make a copy if called more than once
+ cv::Mat getOrientation() {
+
+ return sobelOrientation;
+ }
+
+ // Get a thresholded binary map
+ cv::Mat getBinaryMap(double threshold) {
+
+ cv::Mat bin;
+ cv::threshold(sobelMagnitude,bin,threshold,255,cv::THRESH_BINARY_INV);
+
+ return bin;
+ }
+
+ // Get a CV_8U image of the Sobel
+ cv::Mat getSobelImage() {
+
+ cv::Mat bin;
+
+ double minval, maxval;
+ cv::minMaxLoc(sobelMagnitude,&minval,&maxval);
+ sobelMagnitude.convertTo(bin,CV_8U,255/maxval);
+
+ return bin;
+ }
+
+ // Get a CV_8U image of the Sobel orientation
+ // 1 gray-level = 2 degrees
+ cv::Mat getSobelOrientationImage() {
+
+ cv::Mat bin;
+
+ sobelOrientation.convertTo(bin,CV_8U,90/PI);
+
+ return bin;
+ }
+
+};
+
+
+#endif
/Chapter 07/edgedetector.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 07/linefinder.h
===================================================================
--- Chapter 07/linefinder.h (revision 0)
+++ Chapter 07/linefinder.h (revision 3)
@@ -0,0 +1,157 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 7 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined LINEF
+#define LINEF
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#define PI 3.1415926
+
+class LineFinder {
+
+ private:
+
+ // original image
+ cv::Mat img;
+
+ // vector containing the end points
+ // of the detected lines
+ std::vector<cv::Vec4i> lines;
+
+ // accumulator resolution parameters
+ double deltaRho;
+ double deltaTheta;
+
+ // minimum number of votes that a line
+ // must receive before being considered
+ int minVote;
+
+ // min length for a line
+ double minLength;
+
+ // max allowed gap along the line
+ double maxGap;
+
+ public:
+
+ // Default accumulator resolution is 1 pixel by 1 degree
+ // no gap, no mimimum length
+ LineFinder() : deltaRho(1), deltaTheta(PI/180), minVote(10), minLength(0.), maxGap(0.) {}
+
+ // Set the resolution of the accumulator
+ void setAccResolution(double dRho, double dTheta) {
+
+ deltaRho= dRho;
+ deltaTheta= dTheta;
+ }
+
+ // Set the minimum number of votes
+ void setMinVote(int minv) {
+
+ minVote= minv;
+ }
+
+ // Set line length and gap
+ void setLineLengthAndGap(double length, double gap) {
+
+ minLength= length;
+ maxGap= gap;
+ }
+
+ // Apply probabilistic Hough Transform
+ std::vector<cv::Vec4i> findLines(cv::Mat& binary) {
+
+ lines.clear();
+ cv::HoughLinesP(binary,lines,deltaRho,deltaTheta,minVote, minLength, maxGap);
+
+ return lines;
+ }
+
+ // Draw the detected lines on an image
+ void drawDetectedLines(cv::Mat &image, cv::Scalar color=cv::Scalar(255,255,255)) {
+
+ // Draw the lines
+ std::vector<cv::Vec4i>::const_iterator it2= lines.begin();
+
+ while (it2!=lines.end()) {
+
+ cv::Point pt1((*it2)[0],(*it2)[1]);
+ cv::Point pt2((*it2)[2],(*it2)[3]);
+
+ cv::line( image, pt1, pt2, color);
+
+ ++it2;
+ }
+ }
+
+ // Eliminates lines that do not have an orientation equals to
+ // the ones specified in the input matrix of orientations
+ // At least the given percentage of pixels on the line must
+ // be within plus or minus delta of the corresponding orientation
+ std::vector<cv::Vec4i> removeLinesOfInconsistentOrientations(
+ const cv::Mat &orientations, double percentage, double delta) {
+
+ std::vector<cv::Vec4i>::iterator it= lines.begin();
+
+ // check all lines
+ while (it!=lines.end()) {
+
+ // end points
+ int x1= (*it)[0];
+ int y1= (*it)[1];
+ int x2= (*it)[2];
+ int y2= (*it)[3];
+
+ // line orientation + 90o to get the parallel line
+ double ori1= atan2(static_cast<double>(y1-y2),static_cast<double>(x1-x2))+PI/2;
+ if (ori1>PI) ori1= ori1-2*PI;
+
+ double ori2= atan2(static_cast<double>(y2-y1),static_cast<double>(x2-x1))+PI/2;
+ if (ori2>PI) ori2= ori2-2*PI;
+
+ // for all points on the line
+ cv::LineIterator lit(orientations,cv::Point(x1,y1),cv::Point(x2,y2));
+ int i,count=0;
+ for(i = 0, count=0; i < lit.count; i++, ++lit) {
+
+ float ori= *(reinterpret_cast<float *>(*lit));
+
+ // is line orientation similar to gradient orientation ?
+ if (std::min(fabs(ori-ori1),fabs(ori-ori2))<delta)
+ count++;
+
+ }
+
+ double consistency= count/static_cast<double>(i);
+
+ // set to zero lines of inconsistent orientation
+ if (consistency < percentage) {
+
+ (*it)[0]=(*it)[1]=(*it)[2]=(*it)[3]=0;
+
+ }
+
+ ++it;
+ }
+
+ return lines;
+ }
+};
+
+
+#endif
/Chapter 07/linefinder.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 07/README.txt
===================================================================
--- Chapter 07/README.txt (revision 0)
+++ Chapter 07/README.txt (revision 3)
@@ -0,0 +1,18 @@
+This directory contains material supporting chapter 7 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+Files:
+ edgedetector.h
+ linefinder.h
+ contours.cpp
+correspond to Recipes:
+Detecting Image Contours with the Canny Operator
+Detecting Lines in Images with the Hough Transform
+Fitting a Line to a Set of Points
+
+File:
+ blobs.cpp
+correspond to Recipes:
+Extracting the ComponentsÂ’ Contours
+Computing ComponentsÂ’ Shape Descriptors
/Chapter 07/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 07/contours.cpp
===================================================================
--- Chapter 07/contours.cpp (revision 0)
+++ Chapter 07/contours.cpp (revision 3)
@@ -0,0 +1,277 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 7 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+#include "linefinder.h"
+#include "edgedetector.h"
+
+#define PI 3.1415926
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../road.jpg",0);
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Original Image");
+ cv::imshow("Original Image",image);
+
+ // Compute Sobel
+ EdgeDetector ed;
+ ed.computeSobel(image);
+
+ // Display the Sobel orientation
+ cv::namedWindow("Sobel (orientation)");
+ cv::imshow("Sobel (orientation)",ed.getSobelOrientationImage());
+ cv::imwrite("ori.bmp",ed.getSobelOrientationImage());
+
+ // Display the Sobel low threshold
+ cv::namedWindow("Sobel (low threshold)");
+ cv::imshow("Sobel (low threshold)",ed.getBinaryMap(125));
+
+ // Display the Sobel high threshold
+ cv::namedWindow("Sobel (high threshold)");
+ cv::imshow("Sobel (high threshold)",ed.getBinaryMap(350));
+
+ // Apply Canny algorithm
+ cv::Mat contours;
+ cv::Canny(image,contours,125,350);
+ cv::Mat contoursInv;
+ cv::threshold(contours,contoursInv,128,255,cv::THRESH_BINARY_INV);
+
+ // Display the image of contours
+ cv::namedWindow("Canny Contours");
+ cv::imshow("Canny Contours",contoursInv);
+
+ // Create a test image
+ cv::Mat test(200,200,CV_8U,cv::Scalar(0));
+ cv::line(test,cv::Point(100,0),cv::Point(200,200),cv::Scalar(255));
+ cv::line(test,cv::Point(0,50),cv::Point(200,200),cv::Scalar(255));
+ cv::line(test,cv::Point(0,200),cv::Point(200,0),cv::Scalar(255));
+ cv::line(test,cv::Point(200,0),cv::Point(0,200),cv::Scalar(255));
+ cv::line(test,cv::Point(100,0),cv::Point(100,200),cv::Scalar(255));
+ cv::line(test,cv::Point(0,100),cv::Point(200,100),cv::Scalar(255));
+
+ // Display the test image
+ cv::namedWindow("Test Image");
+ cv::imshow("Test Image",test);
+ cv::imwrite("test.bmp",test);
+
+ // Hough tranform for line detection
+ std::vector<cv::Vec2f> lines;
+ cv::HoughLines(contours,lines,1,PI/180,60);
+
+ // Draw the lines
+ cv::Mat result(contours.rows,contours.cols,CV_8U,cv::Scalar(255));
+ image.copyTo(result);
+
+ std::cout << "Lines detected: " << lines.size() << std::endl;
+
+ std::vector<cv::Vec2f>::const_iterator it= lines.begin();
+ while (it!=lines.end()) {
+
+ float rho= (*it)[0]; // first element is distance rho
+ float theta= (*it)[1]; // second element is angle theta
+
+ if (theta < PI/4. || theta > 3.*PI/4.) { // ~vertical line
+
+ // point of intersection of the line with first row
+ cv::Point pt1(rho/cos(theta),0);
+ // point of intersection of the line with last row
+ cv::Point pt2((rho-result.rows*sin(theta))/cos(theta),result.rows);
+ // draw a white line
+ cv::line( result, pt1, pt2, cv::Scalar(255), 1);
+
+ } else { // ~horizontal line
+
+ // point of intersection of the line with first column
+ cv::Point pt1(0,rho/sin(theta));
+ // point of intersection of the line with last column
+ cv::Point pt2(result.cols,(rho-result.cols*cos(theta))/sin(theta));
+ // draw a white line
+ cv::line( result, pt1, pt2, cv::Scalar(255), 1);
+ }
+
+ std::cout << "line: (" << rho << "," << theta << ")\n";
+
+ ++it;
+ }
+
+ // Display the detected line image
+ cv::namedWindow("Detected Lines with Hough");
+ cv::imshow("Detected Lines with Hough",result);
+
+ // Create LineFinder instance
+ LineFinder ld;
+
+ // Set probabilistic Hough parameters
+ ld.setLineLengthAndGap(100,20);
+ ld.setMinVote(80);
+
+ // Detect lines
+ std::vector<cv::Vec4i> li= ld.findLines(contours);
+ ld.drawDetectedLines(image);
+ cv::namedWindow("Detected Lines with HoughP");
+ cv::imshow("Detected Lines with HoughP",image);
+
+ std::vector<cv::Vec4i>::const_iterator it2= li.begin();
+ while (it2!=li.end()) {
+
+ std::cout << "(" << (*it2)[0] << ","<< (*it2)[1]<< ")-("
+ << (*it2)[2]<< "," << (*it2)[3] << ")" <<std::endl;
+
+ ++it2;
+ }
+
+ // Display one line
+ image= cv::imread("../road.jpg",0);
+ int n=0;
+ cv::line(image, cv::Point(li[n][0],li[n][1]),cv::Point(li[n][2],li[n][3]),cv::Scalar(255),5);
+ cv::namedWindow("One line of the Image");
+ cv::imshow("One line of the Image",image);
+
+ // Extract the contour pixels of the first detected line
+ cv::Mat oneline(image.size(),CV_8U,cv::Scalar(0));
+ cv::line(oneline, cv::Point(li[n][0],li[n][1]),cv::Point(li[n][2],li[n][3]),cv::Scalar(255),5);
+ cv::bitwise_and(contours,oneline,oneline);
+ cv::Mat onelineInv;
+ cv::threshold(oneline,onelineInv,128,255,cv::THRESH_BINARY_INV);
+ cv::namedWindow("One line");
+ cv::imshow("One line",onelineInv);
+
+ std::vector<cv::Point> points;
+
+ // Iterate over the pixels to obtain all point positions
+ for( int y = 0; y < oneline.rows; y++ ) {
+
+ uchar* rowPtr = oneline.ptr<uchar>(y);
+
+ for( int x = 0; x < oneline.cols; x++ ) {
+
+ // if on a contour
+ if (rowPtr[x]) {
+
+ points.push_back(cv::Point(x,y));
+ }
+ }
+ }
+
+ // find the best fitting line
+ cv::Vec4f line;
+ cv::fitLine(cv::Mat(points),line,CV_DIST_L2,0,0.01,0.01);
+
+ std::cout << "line: (" << line[0] << "," << line[1] << ")(" << line[2] << "," << line[3] << ")\n";
+
+ int x0= line[2];
+ int y0= line[3];
+ int x1= x0-200*line[0];
+ int y1= y0-200*line[1];
+ image= cv::imread("../road.jpg",0);
+ cv::line(image,cv::Point(x0,y0),cv::Point(x1,y1),cv::Scalar(0),3);
+ cv::namedWindow("Estimated line");
+ cv::imshow("Estimated line",image);
+
+ // eliminate inconsistent lines
+ ld.removeLinesOfInconsistentOrientations(ed.getOrientation(),0.4,0.1);
+
+ // Display the detected line image
+ image= cv::imread("../road.jpg",0);
+ ld.drawDetectedLines(image);
+ cv::namedWindow("Detected Lines (2)");
+ cv::imshow("Detected Lines (2)",image);
+
+ // Create a Hough accumulator
+ cv::Mat acc(200,180,CV_8U,cv::Scalar(0));
+
+ // Choose a point
+ int x=50, y=30;
+
+ // loop over all angles
+ for (int i=0; i<180; i++) {
+
+ double theta= i*PI/180.;
+
+ // find corresponding rho value
+ double rho= x*cos(theta)+y*sin(theta);
+ int j= static_cast<int>(rho+100.5);
+
+ std::cout << i << "," << j << std::endl;
+
+ // increment accumulator
+ acc.at<uchar>(j,i)++;
+ }
+
+ cv::imwrite("hough1.bmp",acc*100);
+
+ // Choose a second point
+ x=30, y=10;
+
+ // loop over all angles
+ for (int i=0; i<180; i++) {
+
+ double theta= i*PI/180.;
+ double rho= x*cos(theta)+y*sin(theta);
+ int j= static_cast<int>(rho+100.5);
+
+ acc.at<uchar>(j,i)++;
+ }
+
+ cv::namedWindow("Hough Accumulator");
+ cv::imshow("Hough Accumulator",acc*100);
+ cv::imwrite("hough2.bmp",acc*100);
+
+ // Detect circles
+ image= cv::imread("../chariot.jpg",0);
+ cv::GaussianBlur(image,image,cv::Size(5,5),1.5);
+ std::vector<cv::Vec3f> circles;
+ cv::HoughCircles(image, circles, CV_HOUGH_GRADIENT,
+ 2, // accumulator resolution (size of the image / 2)
+ 50, // minimum distance between two circles
+ 200, // Canny high threshold
+ 100, // minimum number of votes
+ 25, 100); // min and max radius
+
+ std::cout << "Circles: " << circles.size() << std::endl;
+
+ // Draw the circles
+ image= cv::imread("../chariot.jpg",0);
+ std::vector<cv::Vec3f>::const_iterator itc= circles.begin();
+
+ while (itc!=circles.end()) {
+
+ cv::circle(image,
+ cv::Point((*itc)[0], (*itc)[1]), // circle centre
+ (*itc)[2], // circle radius
+ cv::Scalar(255), // color
+ 2); // thickness
+
+ ++itc;
+ }
+
+ cv::namedWindow("Detected Circles");
+ cv::imshow("Detected Circles",image);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 07/contours.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 08/tracking.cpp
===================================================================
--- Chapter 08/tracking.cpp (revision 0)
+++ Chapter 08/tracking.cpp (revision 3)
@@ -0,0 +1,108 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 8 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+
+int main()
+{
+ // Read input images
+ cv::Mat image1= cv::imread("../church01.jpg",0);
+ cv::Mat image2= cv::imread("../church02.jpg",0);
+ if (!image1.data || !image2.data)
+ return 0;
+
+ // Display the images
+ cv::namedWindow("Right Image");
+ cv::imshow("Right Image",image1);
+ cv::namedWindow("Left Image");
+ cv::imshow("Left Image",image2);
+
+ // vector of keypoints
+ std::vector<cv::KeyPoint> keypoints1;
+ std::vector<cv::KeyPoint> keypoints2;
+
+ // Construction of the SURF feature detector
+ cv::SurfFeatureDetector surf(3000);
+
+ // Detection of the SURF features
+ surf.detect(image1,keypoints1);
+ surf.detect(image2,keypoints2);
+
+ std::cout << "Number of SURF points (1): " << keypoints1.size() << std::endl;
+ std::cout << "Number of SURF points (2): " << keypoints2.size() << std::endl;
+
+ // Draw the kepoints
+ cv::Mat imageKP;
+ cv::drawKeypoints(image1,keypoints1,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
+ cv::namedWindow("Right SURF Features");
+ cv::imshow("Right SURF Features",imageKP);
+ cv::drawKeypoints(image2,keypoints2,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
+ cv::namedWindow("Left SURF Features");
+ cv::imshow("Left SURF Features",imageKP);
+
+ // Construction of the SURF descriptor extractor
+ cv::SurfDescriptorExtractor surfDesc;
+
+ // Extraction of the SURF descriptors
+ cv::Mat descriptors1, descriptors2;
+ surfDesc.compute(image1,keypoints1,descriptors1);
+ surfDesc.compute(image2,keypoints2,descriptors2);
+
+ std::cout << "descriptor matrix size: " << descriptors1.rows << " by " << descriptors1.cols << std::endl;
+
+ // Construction of the matcher
+ cv::BruteForceMatcher<cv::L2<float>> matcher;
+
+ // Match the two image descriptors
+ std::vector<cv::DMatch> matches;
+ matcher.match(descriptors1,descriptors2, matches);
+
+ std::cout << "Number of matched points: " << matches.size() << std::endl;
+
+ std::nth_element(matches.begin(), // initial position
+ matches.begin()+24, // position of the sorted element
+ matches.end()); // end position
+ // remove all elements after the 25th
+ matches.erase(matches.begin()+25, matches.end());
+
+ cv::Mat imageMatches;
+ cv::drawMatches(image1,keypoints1, // 1st image and its keypoints
+ image2,keypoints2, // 2nd image and its keypoints
+ matches, // the matches
+ imageMatches, // the image produced
+ cv::Scalar(255,255,255)); // color of the lines
+ cv::namedWindow("Matches");
+ cv::imshow("Matches",imageMatches);
+
+ cv::waitKey();
+ return 0;
+
+ int size=7;
+ cv::Mat imaf1;
+ image1.convertTo(imaf1,CV_32F);
+
+ cv::Mat imaf2;
+ image2.convertTo(imaf2,CV_32F);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 08/tracking.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 08/harrisDetector.h
===================================================================
--- Chapter 08/harrisDetector.h (revision 0)
+++ Chapter 08/harrisDetector.h (revision 3)
@@ -0,0 +1,146 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 8 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined HARRISD
+#define HARRISD
+
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+
+class HarrisDetector {
+
+ private:
+
+ // 32-bit float image of corner strength
+ cv::Mat cornerStrength;
+ // 32-bit float image of thresholded corners
+ cv::Mat cornerTh;
+ // image of local maxima (internal)
+ cv::Mat localMax;
+ // size of neighbourhood for derivatives smoothing
+ int neighbourhood;
+ // aperture for gradient computation
+ int aperture;
+ // Harris parameter
+ double k;
+ // maximum strength for threshold computation
+ double maxStrength;
+ // calculated threshold (internal)
+ double threshold;
+ // size of neighbourhood for non-max suppression
+ int nonMaxSize;
+ // kernel for non-max suppression
+ cv::Mat kernel;
+
+ public:
+
+ HarrisDetector() : neighbourhood(3), aperture(3), k(0.1), maxStrength(0.0), threshold(0.01), nonMaxSize(3) {
+
+ setLocalMaxWindowSize(nonMaxSize);
+ }
+
+ // Create kernel used in non-maxima suppression
+ void setLocalMaxWindowSize(int size) {
+
+ nonMaxSize= size;
+ kernel.create(nonMaxSize,nonMaxSize,CV_8U);
+ }
+
+ // Compute Harris corners
+ void detect(const cv::Mat& image) {
+
+ // Harris computation
+ cv::cornerHarris(image,cornerStrength,
+ neighbourhood,// neighborhood size
+ aperture, // aperture size
+ k); // Harris parameter
+
+ // internal threshold computation
+ double minStrength; // not used
+ cv::minMaxLoc(cornerStrength,&minStrength,&maxStrength);
+
+ // local maxima detection
+ cv::Mat dilated; // temporary image
+ cv::dilate(cornerStrength,dilated,cv::Mat());
+ cv::compare(cornerStrength,dilated,localMax,cv::CMP_EQ);
+ }
+
+ // Get the corner map from the computed Harris values
+ cv::Mat getCornerMap(double qualityLevel) {
+
+ cv::Mat cornerMap;
+
+ // thresholding the corner strength
+ threshold= qualityLevel*maxStrength;
+ cv::threshold(cornerStrength,cornerTh,threshold,255,cv::THRESH_BINARY);
+
+ // convert to 8-bit image
+ cornerTh.convertTo(cornerMap,CV_8U);
+
+ // non-maxima suppression
+ cv::bitwise_and(cornerMap,localMax,cornerMap);
+
+ return cornerMap;
+ }
+
+ // Get the feature points vector from the computed Harris values
+ void getCorners(std::vector<cv::Point> &points, double qualityLevel) {
+
+ // Get the corner map
+ cv::Mat cornerMap= getCornerMap(qualityLevel);
+ // Get the corners
+ getCorners(points, cornerMap);
+ }
+
+ // Get the feature points vector from the computed corner map
+ void getCorners(std::vector<cv::Point> &points, const cv::Mat& cornerMap) {
+
+ // Iterate over the pixels to obtain all feature points
+ for( int y = 0; y < cornerMap.rows; y++ ) {
+
+ const uchar* rowPtr = cornerMap.ptr<uchar>(y);
+
+ for( int x = 0; x < cornerMap.cols; x++ ) {
+
+ // if it is a feature point
+ if (rowPtr[x]) {
+
+ points.push_back(cv::Point(x,y));
+ }
+ }
+ }
+ }
+
+ // Draw circles at feature point locations on an image
+ void drawOnImage(cv::Mat &image, const std::vector<cv::Point> &points, cv::Scalar color= cv::Scalar(255,255,255), int radius=3, int thickness=2) {
+
+ std::vector<cv::Point>::const_iterator it= points.begin();
+
+ // for all corners
+ while (it!=points.end()) {
+
+ // draw a circle at each corner location
+ cv::circle(image,*it,radius,color,thickness);
+ ++it;
+ }
+ }
+};
+
+#endif
/Chapter 08/harrisDetector.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 08/README.txt
===================================================================
--- Chapter 08/README.txt (revision 0)
+++ Chapter 08/README.txt (revision 3)
@@ -0,0 +1,16 @@
+This directory contains material supporting chapter 8 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+Files:
+ harrisDetector.h
+ interestPoints.cpp
+correspond to Recipes:
+Detecting Harris Corners
+Detecting Fast Features
+Detecting the Scale-Invariant SURF Features
+
+File:
+ blobs.cpp
+correspond to Recipe:
+Describing SURF Features
\ No newline at end of file
/Chapter 08/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 08/interestPoints.cpp
===================================================================
--- Chapter 08/interestPoints.cpp (revision 0)
+++ Chapter 08/interestPoints.cpp (revision 3)
@@ -0,0 +1,184 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 8 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+
+#include "harrisDetector.h"
+
+int main()
+{
+ // Read input image
+ cv::Mat image= cv::imread("../church01.jpg",0);
+ if (!image.data)
+ return 0;
+
+ // Display the image
+ cv::namedWindow("Original Image");
+ cv::imshow("Original Image",image);
+
+ // Detect Harris Corners
+ cv::Mat cornerStrength;
+ cv::cornerHarris(image,cornerStrength,
+ 3, // neighborhood size
+ 3, // aperture size
+ 0.01); // Harris parameter
+
+ // threshold the corner strengths
+ cv::Mat harrisCorners;
+ double threshold= 0.0001;
+ cv::threshold(cornerStrength,harrisCorners,
+ threshold,255,cv::THRESH_BINARY_INV);
+
+ // Display the corners
+ cv::namedWindow("Harris Corner Map");
+ cv::imshow("Harris Corner Map",harrisCorners);
+
+ // Create Harris detector instance
+ HarrisDetector harris;
+ // Compute Harris values
+ harris.detect(image);
+ // Detect Harris corners
+ std::vector<cv::Point> pts;
+ harris.getCorners(pts,0.01);
+ // Draw Harris corners
+ harris.drawOnImage(image,pts);
+
+ // Display the corners
+ cv::namedWindow("Harris Corners");
+ cv::imshow("Harris Corners",image);
+
+ // Read input image
+ image= cv::imread("../church01.jpg",0);
+
+ // Compute good features to track
+ std::vector<cv::Point2f> corners;
+ cv::goodFeaturesToTrack(image,corners,
+ 500, // maximum number of corners to be returned
+ 0.01, // quality level
+ 10); // minimum allowed distance between points
+
+ // for all corners
+ std::vector<cv::Point2f>::const_iterator it= corners.begin();
+ while (it!=corners.end()) {
+
+ // draw a circle at each corner location
+ cv::circle(image,*it,3,cv::Scalar(255,255,255),2);
+ ++it;
+ }
+
+ // Display the corners
+ cv::namedWindow("Good Features to Track");
+ cv::imshow("Good Features to Track",image);
+
+ // Read input image
+ image= cv::imread("../church01.jpg",0);
+
+ // vector of keypoints
+ std::vector<cv::KeyPoint> keypoints;
+ // Construction of the Good Feature to Track detector
+ cv::GoodFeaturesToTrackDetector gftt(
+ 500, // maximum number of corners to be returned
+ 0.01, // quality level
+ 10); // minimum allowed distance between points
+ // point detection using FeatureDetector method
+ gftt.detect(image,keypoints);
+
+ cv::drawKeypoints(image, // original image
+ keypoints, // vector of keypoints
+ image, // the resulting image
+ cv::Scalar(255,255,255), // color of the points
+ cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); //drawing flag
+
+ // Display the corners
+ cv::namedWindow("Good Features to Track Detector");
+ cv::imshow("Good Features to Track Detector",image);
+
+ // Read input image
+ image= cv::imread("../church01.jpg",0);
+
+ keypoints.clear();
+ cv::FastFeatureDetector fast(40);
+ fast.detect(image,keypoints);
+
+ cv::drawKeypoints(image,keypoints,image,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);
+
+ // Display the corners
+ cv::namedWindow("FAST Features");
+ cv::imshow("FAST Features",image);
+
+ // Read input image
+ image= cv::imread("../church03.jpg",0);
+
+ keypoints.clear();
+ // Construct the SURF feature detector object
+ cv::SurfFeatureDetector surf(2500);
+ // Detect the SURF features
+ surf.detect(image,keypoints);
+
+ cv::Mat featureImage;
+ cv::drawKeypoints(image,keypoints,featureImage,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
+
+ // Display the corners
+ cv::namedWindow("SURF Features");
+ cv::imshow("SURF Features",featureImage);
+
+ // Read input image
+ image= cv::imread("../church01.jpg",0);
+
+ keypoints.clear();
+ // Construct the SURF feature detector object
+ cv::SiftFeatureDetector sift(
+ 0.03, // feature threshold
+ 10.); // threshold to reduce
+ // sensitivity to lines
+
+ // Detect the SURF features
+ sift.detect(image,keypoints);
+
+ cv::drawKeypoints(image,keypoints,featureImage,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
+
+ // Display the corners
+ cv::namedWindow("SIFT Features");
+ cv::imshow("SIFT Features",featureImage);
+
+ // Read input image
+ image= cv::imread("../church01.jpg",0);
+
+ keypoints.clear();
+
+ cv::MserFeatureDetector mser;
+ mser.detect(image,keypoints);
+
+ // Draw the keypoints with scale and orientation information
+ cv::drawKeypoints(image, // original image
+ keypoints, // vector of keypoints
+ featureImage, // the resulting image
+ cv::Scalar(255,255,255), // color of the points
+ cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); //drawing flag
+
+ // Display the corners
+ cv::namedWindow("MSER Features");
+ cv::imshow("MSER Features",featureImage);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 08/interestPoints.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/README.txt
===================================================================
--- Chapter 09/README.txt (revision 0)
+++ Chapter 09/README.txt (revision 3)
@@ -0,0 +1,23 @@
+This directory contains material supporting chapter 9 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+Files:
+ CameraCalibrator.h
+ CameraCalibrator.cpp
+ calibrate.cpp
+correspond to Recipes:
+Calibrating a camera
+File:
+ estimateF.cpp
+correspond to Recipe:
+Computing the Fundamental Matrix of an Image Pair
+Files:
+ matcher.h
+ robustmatching.cpp
+correspond to Recipe:
+Matching Images using Random Sample Consensus
+File:
+ estimateH.cpp
+correspond to Recipe:
+Computing a homography between two images
/Chapter 09/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/CameraCalibrator.cpp
===================================================================
--- Chapter 09/CameraCalibrator.cpp (revision 0)
+++ Chapter 09/CameraCalibrator.cpp (revision 3)
@@ -0,0 +1,149 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 9 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "CameraCalibrator.h"
+
+// Open chessboard images and extract corner points
+int CameraCalibrator::addChessboardPoints(
+ const std::vector<std::string>& filelist,
+ cv::Size & boardSize) {
+
+ // the points on the chessboard
+ std::vector<cv::Point2f> imageCorners;
+ std::vector<cv::Point3f> objectCorners;
+
+ // 3D Scene Points:
+ // Initialize the chessboard corners
+ // in the chessboard reference frame
+ // The corners are at 3D location (X,Y,Z)= (i,j,0)
+ for (int i=0; i<boardSize.height; i++) {
+ for (int j=0; j<boardSize.width; j++) {
+
+ objectCorners.push_back(cv::Point3f(i, j, 0.0f));
+ }
+ }
+
+ // 2D Image points:
+ cv::Mat image; // to contain chessboard image
+ int successes = 0;
+ // for all viewpoints
+ for (int i=0; i<filelist.size(); i++) {
+
+ // Open the image
+ image = cv::imread(filelist[i],0);
+
+ // Get the chessboard corners
+ bool found = cv::findChessboardCorners(
+ image, boardSize, imageCorners);
+
+ // Get subpixel accuracy on the corners
+ cv::cornerSubPix(image, imageCorners,
+ cv::Size(5,5),
+ cv::Size(-1,-1),
+ cv::TermCriteria(cv::TermCriteria::MAX_ITER +
+ cv::TermCriteria::EPS,
+ 30, // max number of iterations
+ 0.1)); // min accuracy
+
+ // If we have a good board, add it to our data
+ if (imageCorners.size() == boardSize.area()) {
+
+ // Add image and scene points from one view
+ addPoints(imageCorners, objectCorners);
+ successes++;
+ }
+
+ //Draw the corners
+ cv::drawChessboardCorners(image, boardSize, imageCorners, found);
+ cv::imshow("Corners on Chessboard", image);
+ cv::waitKey(100);
+ }
+
+ return successes;
+}
+
+// Add scene points and corresponding image points
+void CameraCalibrator::addPoints(const std::vector<cv::Point2f>& imageCorners, const std::vector<cv::Point3f>& objectCorners) {
+
+ // 2D image points from one view
+ imagePoints.push_back(imageCorners);
+ // corresponding 3D scene points
+ objectPoints.push_back(objectCorners);
+}
+
+// Calibrate the camera
+// returns the re-projection error
+double CameraCalibrator::calibrate(cv::Size &imageSize)
+{
+ // undistorter must be reinitialized
+ mustInitUndistort= true;
+
+ //Output rotations and translations
+ std::vector<cv::Mat> rvecs, tvecs;
+
+ // start calibration
+ return
+ calibrateCamera(objectPoints, // the 3D points
+ imagePoints, // the image points
+ imageSize, // image size
+ cameraMatrix, // output camera matrix
+ distCoeffs, // output distortion matrix
+ rvecs, tvecs, // Rs, Ts
+ flag); // set options
+// ,CV_CALIB_USE_INTRINSIC_GUESS);
+
+}
+
+// remove distortion in an image (after calibration)
+cv::Mat CameraCalibrator::remap(const cv::Mat &image) {
+
+ cv::Mat undistorted;
+
+ if (mustInitUndistort) { // called once per calibration
+
+ cv::initUndistortRectifyMap(
+ cameraMatrix, // computed camera matrix
+ distCoeffs, // computed distortion matrix
+ cv::Mat(), // optional rectification (none)
+ cv::Mat(), // camera matrix to generate undistorted
+ cv::Size(640,480),
+// image.size(), // size of undistorted
+ CV_32FC1, // type of output map
+ map1, map2); // the x and y mapping functions
+
+ mustInitUndistort= false;
+ }
+
+ // Apply mapping functions
+ cv::remap(image, undistorted, map1, map2,
+ cv::INTER_LINEAR); // interpolation type
+
+ return undistorted;
+}
+
+
+// Set the calibration options
+// 8radialCoeffEnabled should be true if 8 radial coefficients are required (5 is default)
+// tangentialParamEnabled should be true if tangeantial distortion is present
+void CameraCalibrator::setCalibrationFlag(bool radial8CoeffEnabled, bool tangentialParamEnabled) {
+
+ // Set the flag used in cv::calibrateCamera()
+ flag = 0;
+ if (!tangentialParamEnabled) flag += CV_CALIB_ZERO_TANGENT_DIST;
+ if (radial8CoeffEnabled) flag += CV_CALIB_RATIONAL_MODEL;
+}
+
/Chapter 09/CameraCalibrator.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/CameraCalibrator.h
===================================================================
--- Chapter 09/CameraCalibrator.h (revision 0)
+++ Chapter 09/CameraCalibrator.h (revision 3)
@@ -0,0 +1,62 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 9 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#ifndef CAMERACALIBRATOR_H
+#define CAMERACALIBRATOR_H
+
+#include <vector>
+#include <iostream>
+
+#include <opencv2/core/core.hpp>
+#include "opencv2/imgproc/imgproc.hpp"
+#include "opencv2/calib3d/calib3d.hpp"
+#include <opencv2/highgui/highgui.hpp>
+
+class CameraCalibrator {
+
+ // input points
+ std::vector<std::vector<cv::Point3f>> objectPoints;
+ std::vector<std::vector<cv::Point2f>> imagePoints;
+ // output Matrices
+ cv::Mat cameraMatrix;
+ cv::Mat distCoeffs;
+ // flag to specify how calibration is done
+ int flag;
+ // used in image undistortion
+ cv::Mat map1,map2;
+ bool mustInitUndistort;
+
+ public:
+ CameraCalibrator() : flag(0), mustInitUndistort(true) {};
+
+ // Open the chessboard images and extract corner points
+ int addChessboardPoints(const std::vector<std::string>& filelist, cv::Size & boardSize);
+ // Add scene points and corresponding image points
+ void addPoints(const std::vector<cv::Point2f>& imageCorners, const std::vector<cv::Point3f>& objectCorners);
+ // Calibrate the camera
+ double calibrate(cv::Size &imageSize);
+ // Set the calibration flag
+ void setCalibrationFlag(bool radial8CoeffEnabled=false, bool tangentialParamEnabled=false);
+ // Remove distortion in an image (after calibration)
+ cv::Mat CameraCalibrator::remap(const cv::Mat &image);
+
+ // Getters
+ cv::Mat getCameraMatrix() { return cameraMatrix; }
+ cv::Mat getDistCoeffs() { return distCoeffs; }
+};
+
+#endif // CAMERACALIBRATOR_H
/Chapter 09/CameraCalibrator.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/estimateF.cpp
===================================================================
--- Chapter 09/estimateF.cpp (revision 0)
+++ Chapter 09/estimateF.cpp (revision 3)
@@ -0,0 +1,331 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 9 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+#include <opencv2/calib3d/calib3d.hpp>
+
+int main()
+{
+ // Read input images
+ cv::Mat image1= cv::imread("../church01.jpg",0);
+ cv::Mat image2= cv::imread("../church03.jpg",0);
+ if (!image1.data || !image2.data)
+ return 0;
+
+ // Display the images
+ cv::namedWindow("Right Image");
+ cv::imshow("Right Image",image1);
+ cv::namedWindow("Left Image");
+ cv::imshow("Left Image",image2);
+
+ // vector of keypoints
+ std::vector<cv::KeyPoint> keypoints1;
+ std::vector<cv::KeyPoint> keypoints2;
+
+ // Construction of the SURF feature detector
+ cv::SurfFeatureDetector surf(3000);
+
+ // Detection of the SURF features
+ surf.detect(image1,keypoints1);
+ surf.detect(image2,keypoints2);
+
+ std::cout << "Number of SURF points (1): " << keypoints1.size() << std::endl;
+ std::cout << "Number of SURF points (2): " << keypoints2.size() << std::endl;
+
+ // Draw the kepoints
+ cv::Mat imageKP;
+ cv::drawKeypoints(image1,keypoints1,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
+ cv::namedWindow("Right SURF Features");
+ cv::imshow("Right SURF Features",imageKP);
+ cv::drawKeypoints(image2,keypoints2,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
+ cv::namedWindow("Left SURF Features");
+ cv::imshow("Left SURF Features",imageKP);
+
+ // Construction of the SURF descriptor extractor
+ cv::SurfDescriptorExtractor surfDesc;
+
+ // Extraction of the SURF descriptors
+ cv::Mat descriptors1, descriptors2;
+ surfDesc.compute(image1,keypoints1,descriptors1);
+ surfDesc.compute(image2,keypoints2,descriptors2);
+
+ std::cout << "descriptor matrix size: " << descriptors1.rows << " by " << descriptors1.cols << std::endl;
+
+ // Construction of the matcher
+ cv::BruteForceMatcher<cv::L2<float>> matcher;
+
+ // Match the two image descriptors
+ std::vector<cv::DMatch> matches;
+ matcher.match(descriptors1,descriptors2, matches);
+
+ std::cout << "Number of matched points: " << matches.size() << std::endl;
+
+ // Select few Matches
+ std::vector<cv::DMatch> selMatches;
+ /*
+ keypoints1.push_back(cv::KeyPoint(342.,615.,2));
+ keypoints2.push_back(cv::KeyPoint(410.,600.,2));
+ selMatches.push_back(cv::DMatch(keypoints1.size()-1,keypoints2.size()-1,0)); // street light bulb
+ selMatches.push_back(matches[6]); // right tower
+ selMatches.push_back(matches[60]); // left bottom window
+ selMatches.push_back(matches[139]);
+ selMatches.push_back(matches[141]); // middle window
+ selMatches.push_back(matches[213]);
+ selMatches.push_back(matches[273]);
+
+ int kk=0;
+ while (kk<matches.size()) {
+ std::cout<<kk<<std::endl;
+ selMatches.push_back(matches[kk++]);
+ selMatches.pop_back();
+ cv::waitKey();
+ }
+ */
+
+ /* between church01 and church03 */
+ selMatches.push_back(matches[14]);
+ selMatches.push_back(matches[16]);
+ selMatches.push_back(matches[141]);
+ selMatches.push_back(matches[146]);
+ selMatches.push_back(matches[235]);
+ selMatches.push_back(matches[238]);
+ selMatches.push_back(matches[274]);
+
+ // Draw the selected matches
+ cv::Mat imageMatches;
+ cv::drawMatches(image1,keypoints1, // 1st image and its keypoints
+ image2,keypoints2, // 2nd image and its keypoints
+// selMatches, // the matches
+ matches, // the matches
+ imageMatches, // the image produced
+ cv::Scalar(255,255,255)); // color of the lines
+ cv::namedWindow("Matches");
+ cv::imshow("Matches",imageMatches);
+
+ // Convert 1 vector of keypoints into
+ // 2 vectors of Point2f
+ std::vector<int> pointIndexes1;
+ std::vector<int> pointIndexes2;
+ for (std::vector<cv::DMatch>::const_iterator it= selMatches.begin();
+ it!= selMatches.end(); ++it) {
+
+ // Get the indexes of the selected matched keypoints
+ pointIndexes1.push_back(it->queryIdx);
+ pointIndexes2.push_back(it->trainIdx);
+ }
+
+ // Convert keypoints into Point2f
+ std::vector<cv::Point2f> selPoints1, selPoints2;
+ cv::KeyPoint::convert(keypoints1,selPoints1,pointIndexes1);
+ cv::KeyPoint::convert(keypoints2,selPoints2,pointIndexes2);
+
+ // check by drawing the points
+ std::vector<cv::Point2f>::const_iterator it= selPoints1.begin();
+ while (it!=selPoints1.end()) {
+
+ // draw a circle at each corner location
+ cv::circle(image1,*it,3,cv::Scalar(255,255,255),2);
+ ++it;
+ }
+
+ it= selPoints2.begin();
+ while (it!=selPoints2.end()) {
+
+ // draw a circle at each corner location
+ cv::circle(image2,*it,3,cv::Scalar(255,255,255),2);
+ ++it;
+ }
+
+ // Compute F matrix from 7 matches
+ cv::Mat fundemental= cv::findFundamentalMat(
+ cv::Mat(selPoints1), // points in first image
+ cv::Mat(selPoints2), // points in second image
+ CV_FM_7POINT); // 7-point method
+
+ std::cout << "F-Matrix size= " << fundemental.rows << "," << fundemental.cols << std::endl;
+
+ // draw the left points corresponding epipolar lines in right image
+ std::vector<cv::Vec3f> lines1;
+ cv::computeCorrespondEpilines(
+ cv::Mat(selPoints1), // image points
+ 1, // in image 1 (can also be 2)
+ fundemental, // F matrix
+ lines1); // vector of epipolar lines
+
+ // for all epipolar lines
+ for (vector<cv::Vec3f>::const_iterator it= lines1.begin();
+ it!=lines1.end(); ++it) {
+
+ // draw the epipolar line between first and last column
+ cv::line(image2,cv::Point(0,-(*it)[2]/(*it)[1]),
+ cv::Point(image2.cols,-((*it)[2]+(*it)[0]*image2.cols)/(*it)[1]),
+ cv::Scalar(255,255,255));
+ }
+
+ // draw the left points corresponding epipolar lines in left image
+ std::vector<cv::Vec3f> lines2;
+ cv::computeCorrespondEpilines(cv::Mat(selPoints2),2,fundemental,lines2);
+ for (vector<cv::Vec3f>::const_iterator it= lines2.begin();
+ it!=lines2.end(); ++it) {
+
+ // draw the epipolar line between first and last column
+ cv::line(image1,cv::Point(0,-(*it)[2]/(*it)[1]),
+ cv::Point(image1.cols,-((*it)[2]+(*it)[0]*image1.cols)/(*it)[1]),
+ cv::Scalar(255,255,255));
+ }
+
+ // Display the images with points and epipolar lines
+ cv::namedWindow("Right Image Epilines");
+ cv::imshow("Right Image Epilines",image1);
+ cv::namedWindow("Left Image Epilines");
+ cv::imshow("Left Image Epilines",image2);
+
+ /*
+ std::nth_element(matches.begin(), // initial position
+ matches.begin()+matches.size()/2, // 50%
+ matches.end()); // end position
+ // remove all elements after the
+ matches.erase(matches.begin()+matches.size()/2, matches.end());
+*/
+ // Convert keypoints into Point2f
+ std::vector<cv::Point2f> points1, points2;
+ for (std::vector<cv::DMatch>::const_iterator it= matches.begin();
+ it!= matches.end(); ++it) {
+
+ // Get the position of left keypoints
+ float x= keypoints1[it->queryIdx].pt.x;
+ float y= keypoints1[it->queryIdx].pt.y;
+ points1.push_back(cv::Point2f(x,y));
+ // Get the position of right keypoints
+ x= keypoints2[it->trainIdx].pt.x;
+ y= keypoints2[it->trainIdx].pt.y;
+ points2.push_back(cv::Point2f(x,y));
+ }
+
+ std::cout << points1.size() << " " << points2.size() << std::endl;
+
+ // Compute F matrix using RANSAC
+ std::vector<uchar> inliers(points1.size(),0);
+ fundemental= cv::findFundamentalMat(
+ cv::Mat(points1),cv::Mat(points2), // matching points
+ inliers, // match status (inlier ou outlier)
+ CV_FM_RANSAC, // RANSAC method
+ 1, // distance to epipolar line
+ 0.98); // confidence probability
+
+ // Read input images
+ image1= cv::imread("../church01.jpg",0);
+ image2= cv::imread("../church03.jpg",0);
+
+ // Draw the epipolar line of few points
+ cv::computeCorrespondEpilines(cv::Mat(selPoints1),1,fundemental,lines1);
+ for (vector<cv::Vec3f>::const_iterator it= lines1.begin();
+ it!=lines1.end(); ++it) {
+
+ cv::line(image2,cv::Point(0,-(*it)[2]/(*it)[1]),
+ cv::Point(image2.cols,-((*it)[2]+(*it)[0]*image2.cols)/(*it)[1]),
+ cv::Scalar(255,255,255));
+ }
+
+ cv::computeCorrespondEpilines(cv::Mat(selPoints2),2,fundemental,lines2);
+ for (vector<cv::Vec3f>::const_iterator it= lines2.begin();
+ it!=lines2.end(); ++it) {
+
+ cv::line(image1,cv::Point(0,-(*it)[2]/(*it)[1]),
+ cv::Point(image1.cols,-((*it)[2]+(*it)[0]*image1.cols)/(*it)[1]),
+ cv::Scalar(255,255,255));
+ }
+
+ // Draw the inlier points
+ std::vector<cv::Point2f> points1In, points2In;
+ std::vector<cv::Point2f>::const_iterator itPts= points1.begin();
+ std::vector<uchar>::const_iterator itIn= inliers.begin();
+ while (itPts!=points1.end()) {
+
+ // draw a circle at each inlier location
+ if (*itIn) {
+ cv::circle(image1,*itPts,3,cv::Scalar(255,255,255),2);
+ points1In.push_back(*itPts);
+ }
+ ++itPts;
+ ++itIn;
+ }
+
+ itPts= points2.begin();
+ itIn= inliers.begin();
+ while (itPts!=points2.end()) {
+
+ // draw a circle at each inlier location
+ if (*itIn) {
+ cv::circle(image2,*itPts,3,cv::Scalar(255,255,255),2);
+ points2In.push_back(*itPts);
+ }
+ ++itPts;
+ ++itIn;
+ }
+
+ // Display the images with points
+ cv::namedWindow("Right Image Epilines (RANSAC)");
+ cv::imshow("Right Image Epilines (RANSAC)",image1);
+ cv::namedWindow("Left Image Epilines (RANSAC)");
+ cv::imshow("Left Image Epilines (RANSAC)",image2);
+
+ cv::findHomography(cv::Mat(points1In),cv::Mat(points2In),inliers,CV_RANSAC,1.);
+
+ // Read input images
+ image1= cv::imread("../church01.jpg",0);
+ image2= cv::imread("../church03.jpg",0);
+
+ // Draw the inlier points
+ itPts= points1In.begin();
+ itIn= inliers.begin();
+ while (itPts!=points1In.end()) {
+
+ // draw a circle at each inlier location
+ if (*itIn)
+ cv::circle(image1,*itPts,3,cv::Scalar(255,255,255),2);
+
+ ++itPts;
+ ++itIn;
+ }
+
+ itPts= points2In.begin();
+ itIn= inliers.begin();
+ while (itPts!=points2In.end()) {
+
+ // draw a circle at each inlier location
+ if (*itIn)
+ cv::circle(image2,*itPts,3,cv::Scalar(255,255,255),2);
+
+ ++itPts;
+ ++itIn;
+ }
+
+ // Display the images with points
+ cv::namedWindow("Right Image Homography (RANSAC)");
+ cv::imshow("Right Image Homography (RANSAC)",image1);
+ cv::namedWindow("Left Image Homography (RANSAC)");
+ cv::imshow("Left Image Homography (RANSAC)",image2);
+
+ cv::waitKey();
+ return 0;
+ }
\ No newline at end of file
/Chapter 09/estimateF.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/estimateH.cpp
===================================================================
--- Chapter 09/estimateH.cpp (revision 0)
+++ Chapter 09/estimateH.cpp (revision 3)
@@ -0,0 +1,137 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 9 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+#include <opencv2/calib3d/calib3d.hpp>
+#include "matcher.h"
+
+int main()
+{
+ // Read input images
+ cv::Mat image1= cv::imread("../parliament1.bmp",0);
+ cv::Mat image2= cv::imread("../parliament2.bmp",0);
+ if (!image1.data || !image2.data)
+ return 0;
+
+ // Display the images
+ cv::namedWindow("Image 1");
+ cv::imshow("Image 1",image1);
+ cv::namedWindow("Image 2");
+ cv::imshow("Image 2",image2);
+
+ // Prepare the matcher
+ RobustMatcher rmatcher;
+ rmatcher.setConfidenceLevel(0.98);
+ rmatcher.setMinDistanceToEpipolar(1.0);
+ rmatcher.setRatio(0.65f);
+ cv::Ptr<cv::FeatureDetector> pfd= new cv::SurfFeatureDetector(10);
+ rmatcher.setFeatureDetector(pfd);
+
+ // Match the two images
+ std::vector<cv::DMatch> matches;
+ std::vector<cv::KeyPoint> keypoints1, keypoints2;
+ cv::Mat fundemental= rmatcher.match(image1,image2,matches, keypoints1, keypoints2);
+
+ // draw the matches
+ cv::Mat imageMatches;
+ cv::drawMatches(image1,keypoints1, // 1st image and its keypoints
+ image2,keypoints2, // 2nd image and its keypoints
+ matches, // the matches
+ imageMatches, // the image produced
+ cv::Scalar(255,255,255)); // color of the lines
+ cv::namedWindow("Matches");
+ cv::imshow("Matches",imageMatches);
+
+ // Convert keypoints into Point2f
+ std::vector<cv::Point2f> points1, points2;
+ for (std::vector<cv::DMatch>::const_iterator it= matches.begin();
+ it!= matches.end(); ++it) {
+
+ // Get the position of left keypoints
+ float x= keypoints1[it->queryIdx].pt.x;
+ float y= keypoints1[it->queryIdx].pt.y;
+ points1.push_back(cv::Point2f(x,y));
+ // Get the position of right keypoints
+ x= keypoints2[it->trainIdx].pt.x;
+ y= keypoints2[it->trainIdx].pt.y;
+ points2.push_back(cv::Point2f(x,y));
+ }
+
+ std::cout << points1.size() << " " << points2.size() << std::endl;
+
+ // Find the homography between image 1 and image 2
+ std::vector<uchar> inliers(points1.size(),0);
+ cv::Mat homography= cv::findHomography(
+ cv::Mat(points1),cv::Mat(points2), // corresponding points
+ inliers, // outputed inliers matches
+ CV_RANSAC, // RANSAC method
+ 1.); // max distance to reprojection point
+
+ // Draw the inlier points
+ std::vector<cv::Point2f>::const_iterator itPts= points1.begin();
+ std::vector<uchar>::const_iterator itIn= inliers.begin();
+ while (itPts!=points1.end()) {
+
+ // draw a circle at each inlier location
+ if (*itIn)
+ cv::circle(image1,*itPts,3,cv::Scalar(255,255,255),2);
+
+ ++itPts;
+ ++itIn;
+ }
+
+ itPts= points2.begin();
+ itIn= inliers.begin();
+ while (itPts!=points2.end()) {
+
+ // draw a circle at each inlier location
+ if (*itIn)
+ cv::circle(image2,*itPts,3,cv::Scalar(255,255,255),2);
+
+ ++itPts;
+ ++itIn;
+ }
+
+ // Display the images with points
+ cv::namedWindow("Image 1 Homography Points");
+ cv::imshow("Image 1 Homography Points",image1);
+ cv::namedWindow("Image 2 Homography Points");
+ cv::imshow("Image 2 Homography Points",image2);
+
+ // Warp image 1 to image 2
+ cv::Mat result;
+ cv::warpPerspective(image1, // input image
+ result, // output image
+ homography, // homography
+ cv::Size(2*image1.cols,image1.rows)); // size of output image
+
+ // Copy image 1 on the first half of full image
+ cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows));
+ image2.copyTo(half);
+
+ // Display the warp image
+ cv::namedWindow("After warping");
+ cv::imshow("After warping",result);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 09/estimateH.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/calibrate.cpp
===================================================================
--- Chapter 09/calibrate.cpp (revision 0)
+++ Chapter 09/calibrate.cpp (revision 3)
@@ -0,0 +1,76 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 9 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <iomanip>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+
+#include "CameraCalibrator.h"
+
+int main()
+{
+
+ cv::namedWindow("Image");
+ cv::Mat image;
+ std::vector<std::string> filelist;
+
+ // generate list of chessboard image filename
+ for (int i=1; i<=20; i++) {
+
+ std::stringstream str;
+ str << "../chessboards/chessboard" << std::setw(2) << std::setfill('0') << i << ".jpg";
+ std::cout << str.str() << std::endl;
+
+ filelist.push_back(str.str());
+ image= cv::imread(str.str(),0);
+ cv::imshow("Image",image);
+
+ cv::waitKey(100);
+ }
+
+ // Create calibrator object
+ CameraCalibrator cameraCalibrator;
+ // add the corners from the chessboard
+ cv::Size boardSize(6,4);
+ cameraCalibrator.addChessboardPoints(
+ filelist, // filenames of chessboard image
+ boardSize); // size of chessboard
+ // calibrate the camera
+ // cameraCalibrator.setCalibrationFlag(true,true);
+ cameraCalibrator.calibrate(image.size());
+
+ // Image Undistortion
+ image = cv::imread(filelist[6]);
+ cv::Mat uImage= cameraCalibrator.remap(image);
+
+ // display camera matrix
+ cv::Mat cameraMatrix= cameraCalibrator.getCameraMatrix();
+ std::cout << " Camera intrinsic: " << cameraMatrix.rows << "x" << cameraMatrix.cols << std::endl;
+ std::cout << cameraMatrix.at<double>(0,0) << " " << cameraMatrix.at<double>(0,1) << " " << cameraMatrix.at<double>(0,2) << std::endl;
+ std::cout << cameraMatrix.at<double>(1,0) << " " << cameraMatrix.at<double>(1,1) << " " << cameraMatrix.at<double>(1,2) << std::endl;
+ std::cout << cameraMatrix.at<double>(2,0) << " " << cameraMatrix.at<double>(2,1) << " " << cameraMatrix.at<double>(2,2) << std::endl;
+
+ imshow("Original Image", image);
+ imshow("Undistorted Image", uImage);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 09/calibrate.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/matcher.h
===================================================================
--- Chapter 09/matcher.h (revision 0)
+++ Chapter 09/matcher.h (revision 3)
@@ -0,0 +1,288 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 9 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined MATCHER
+#define MATCHER
+
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+
+class RobustMatcher {
+
+ private:
+
+ // pointer to the feature point detector object
+ cv::Ptr<cv::FeatureDetector> detector;
+ // pointer to the feature descriptor extractor object
+ cv::Ptr<cv::DescriptorExtractor> extractor;
+ float ratio; // max ratio between 1st and 2nd NN
+ bool refineF; // if true will refine the F matrix
+ double distance; // min distance to epipolar
+ double confidence; // confidence level (probability)
+
+ public:
+
+ RobustMatcher() : ratio(0.65f), refineF(true), confidence(0.99), distance(3.0) {
+
+ // SURF is the default feature
+ detector= new cv::SurfFeatureDetector();
+ extractor= new cv::SurfDescriptorExtractor();
+ }
+
+ // Set the feature detector
+ void setFeatureDetector(cv::Ptr<cv::FeatureDetector>& detect) {
+
+ detector= detect;
+ }
+
+ // Set descriptor extractor
+ void setDescriptorExtractor(cv::Ptr<cv::DescriptorExtractor>& desc) {
+
+ extractor= desc;
+ }
+
+ // Set the minimum distance to epipolar in RANSAC
+ void setMinDistanceToEpipolar(double d) {
+
+ distance= d;
+ }
+
+ // Set confidence level in RANSAC
+ void setConfidenceLevel(double c) {
+
+ confidence= c;
+ }
+
+ // Set the NN ratio
+ void setRatio(float r) {
+
+ ratio= r;
+ }
+
+ // if you want the F matrix to be recalculated
+ void refineFundamental(bool flag) {
+
+ refineF= flag;
+ }
+
+ // Clear matches for which NN ratio is > than threshold
+ // return the number of removed points
+ // (corresponding entries being cleared, i.e. size will be 0)
+ int ratioTest(std::vector<std::vector<cv::DMatch>>& matches) {
+
+ int removed=0;
+
+ // for all matches
+ for (std::vector<std::vector<cv::DMatch>>::iterator matchIterator= matches.begin();
+ matchIterator!= matches.end(); ++matchIterator) {
+
+ // if 2 NN has been identified
+ if (matchIterator->size() > 1) {
+
+ // check distance ratio
+ if ((*matchIterator)[0].distance/(*matchIterator)[1].distance > ratio) {
+
+ matchIterator->clear(); // remove match
+ removed++;
+ }
+
+ } else { // does not have 2 neighbours
+
+ matchIterator->clear(); // remove match
+ removed++;
+ }
+ }
+
+ return removed;
+ }
+
+ // Insert symmetrical matches in symMatches vector
+ void symmetryTest(const std::vector<std::vector<cv::DMatch>>& matches1,
+ const std::vector<std::vector<cv::DMatch>>& matches2,
+ std::vector<cv::DMatch>& symMatches) {
+
+ // for all matches image 1 -> image 2
+ for (std::vector<std::vector<cv::DMatch>>::const_iterator matchIterator1= matches1.begin();
+ matchIterator1!= matches1.end(); ++matchIterator1) {
+
+ if (matchIterator1->size() < 2) // ignore deleted matches
+ continue;
+
+ // for all matches image 2 -> image 1
+ for (std::vector<std::vector<cv::DMatch>>::const_iterator matchIterator2= matches2.begin();
+ matchIterator2!= matches2.end(); ++matchIterator2) {
+
+ if (matchIterator2->size() < 2) // ignore deleted matches
+ continue;
+
+ // Match symmetry test
+ if ((*matchIterator1)[0].queryIdx == (*matchIterator2)[0].trainIdx &&
+ (*matchIterator2)[0].queryIdx == (*matchIterator1)[0].trainIdx) {
+
+ // add symmetrical match
+ symMatches.push_back(cv::DMatch((*matchIterator1)[0].queryIdx,
+ (*matchIterator1)[0].trainIdx,
+ (*matchIterator1)[0].distance));
+ break; // next match in image 1 -> image 2
+ }
+ }
+ }
+ }
+
+ // Identify good matches using RANSAC
+ // Return fundemental matrix
+ cv::Mat ransacTest(const std::vector<cv::DMatch>& matches,
+ const std::vector<cv::KeyPoint>& keypoints1,
+ const std::vector<cv::KeyPoint>& keypoints2,
+ std::vector<cv::DMatch>& outMatches) {
+
+ // Convert keypoints into Point2f
+ std::vector<cv::Point2f> points1, points2;
+ for (std::vector<cv::DMatch>::const_iterator it= matches.begin();
+ it!= matches.end(); ++it) {
+
+ // Get the position of left keypoints
+ float x= keypoints1[it->queryIdx].pt.x;
+ float y= keypoints1[it->queryIdx].pt.y;
+ points1.push_back(cv::Point2f(x,y));
+ // Get the position of right keypoints
+ x= keypoints2[it->trainIdx].pt.x;
+ y= keypoints2[it->trainIdx].pt.y;
+ points2.push_back(cv::Point2f(x,y));
+ }
+
+ // Compute F matrix using RANSAC
+ std::vector<uchar> inliers(points1.size(),0);
+ cv::Mat fundemental= cv::findFundamentalMat(
+ cv::Mat(points1),cv::Mat(points2), // matching points
+ inliers, // match status (inlier ou outlier)
+ CV_FM_RANSAC, // RANSAC method
+ distance, // distance to epipolar line
+ confidence); // confidence probability
+
+ // extract the surviving (inliers) matches
+ std::vector<uchar>::const_iterator itIn= inliers.begin();
+ std::vector<cv::DMatch>::const_iterator itM= matches.begin();
+ // for all matches
+ for ( ;itIn!= inliers.end(); ++itIn, ++itM) {
+
+ if (*itIn) { // it is a valid match
+
+ outMatches.push_back(*itM);
+ }
+ }
+
+ std::cout << "Number of matched points (after cleaning): " << outMatches.size() << std::endl;
+
+ if (refineF) {
+ // The F matrix will be recomputed with all accepted matches
+
+ // Convert keypoints into Point2f for final F computation
+ points1.clear();
+ points2.clear();
+
+ for (std::vector<cv::DMatch>::const_iterator it= outMatches.begin();
+ it!= outMatches.end(); ++it) {
+
+ // Get the position of left keypoints
+ float x= keypoints1[it->queryIdx].pt.x;
+ float y= keypoints1[it->queryIdx].pt.y;
+ points1.push_back(cv::Point2f(x,y));
+ // Get the position of right keypoints
+ x= keypoints2[it->trainIdx].pt.x;
+ y= keypoints2[it->trainIdx].pt.y;
+ points2.push_back(cv::Point2f(x,y));
+ }
+
+ // Compute 8-point F from all accepted matches
+ fundemental= cv::findFundamentalMat(
+ cv::Mat(points1),cv::Mat(points2), // matching points
+ CV_FM_8POINT); // 8-point method
+ }
+
+ return fundemental;
+ }
+
+ // Match feature points using symmetry test and RANSAC
+ // returns fundemental matrix
+ cv::Mat match(cv::Mat& image1, cv::Mat& image2, // input images
+ std::vector<cv::DMatch>& matches, // output matches and keypoints
+ std::vector<cv::KeyPoint>& keypoints1, std::vector<cv::KeyPoint>& keypoints2) {
+
+ // 1a. Detection of the SURF features
+ detector->detect(image1,keypoints1);
+ detector->detect(image2,keypoints2);
+
+ std::cout << "Number of SURF points (1): " << keypoints1.size() << std::endl;
+ std::cout << "Number of SURF points (2): " << keypoints2.size() << std::endl;
+
+ // 1b. Extraction of the SURF descriptors
+ cv::Mat descriptors1, descriptors2;
+ extractor->compute(image1,keypoints1,descriptors1);
+ extractor->compute(image2,keypoints2,descriptors2);
+
+ std::cout << "descriptor matrix size: " << descriptors1.rows << " by " << descriptors1.cols << std::endl;
+
+ // 2. Match the two image descriptors
+
+ // Construction of the matcher
+ cv::BruteForceMatcher<cv::L2<float>> matcher;
+
+ // from image 1 to image 2
+ // based on k nearest neighbours (with k=2)
+ std::vector<std::vector<cv::DMatch>> matches1;
+ matcher.knnMatch(descriptors1,descriptors2,
+ matches1, // vector of matches (up to 2 per entry)
+ 2); // return 2 nearest neighbours
+
+ // from image 2 to image 1
+ // based on k nearest neighbours (with k=2)
+ std::vector<std::vector<cv::DMatch>> matches2;
+ matcher.knnMatch(descriptors2,descriptors1,
+ matches2, // vector of matches (up to 2 per entry)
+ 2); // return 2 nearest neighbours
+
+ std::cout << "Number of matched points 1->2: " << matches1.size() << std::endl;
+ std::cout << "Number of matched points 2->1: " << matches2.size() << std::endl;
+
+ // 3. Remove matches for which NN ratio is > than threshold
+
+ // clean image 1 -> image 2 matches
+ int removed= ratioTest(matches1);
+ std::cout << "Number of matched points 1->2 (ratio test) : " << matches1.size()-removed << std::endl;
+ // clean image 2 -> image 1 matches
+ removed= ratioTest(matches2);
+ std::cout << "Number of matched points 1->2 (ratio test) : " << matches2.size()-removed << std::endl;
+
+ // 4. Remove non-symmetrical matches
+ std::vector<cv::DMatch> symMatches;
+ symmetryTest(matches1,matches2,symMatches);
+
+ std::cout << "Number of matched points (symmetry test): " << symMatches.size() << std::endl;
+
+ // 5. Validate matches using RANSAC
+ cv::Mat fundemental= ransacTest(symMatches, keypoints1, keypoints2, matches);
+
+ // return the found fundemental matrix
+ return fundemental;
+ }
+};
+
+#endif
/Chapter 09/matcher.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 09/robustmatching.cpp
===================================================================
--- Chapter 09/robustmatching.cpp (revision 0)
+++ Chapter 09/robustmatching.cpp (revision 3)
@@ -0,0 +1,113 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 9 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/features2d/features2d.hpp>
+#include <opencv2/calib3d/calib3d.hpp>
+#include "matcher.h"
+
+int main()
+{
+ // Read input images
+ cv::Mat image1= cv::imread("../canal1.jpg",0);
+ cv::Mat image2= cv::imread("../canal2.jpg",0);
+ if (!image1.data || !image2.data)
+ return 0;
+
+ // Display the images
+ cv::namedWindow("Right Image");
+ cv::imshow("Right Image",image1);
+ cv::namedWindow("Left Image");
+ cv::imshow("Left Image",image2);
+
+ // Prepare the matcher
+ RobustMatcher rmatcher;
+ rmatcher.setConfidenceLevel(0.98);
+ rmatcher.setMinDistanceToEpipolar(1.0);
+ rmatcher.setRatio(0.65f);
+ cv::Ptr<cv::FeatureDetector> pfd= new cv::SurfFeatureDetector(10);
+ rmatcher.setFeatureDetector(pfd);
+
+ // Match the two images
+ std::vector<cv::DMatch> matches;
+ std::vector<cv::KeyPoint> keypoints1, keypoints2;
+ cv::Mat fundemental= rmatcher.match(image1,image2,matches, keypoints1, keypoints2);
+
+ // draw the matches
+ cv::Mat imageMatches;
+ cv::drawMatches(image1,keypoints1, // 1st image and its keypoints
+ image2,keypoints2, // 2nd image and its keypoints
+ matches, // the matches
+ imageMatches, // the image produced
+ cv::Scalar(255,255,255)); // color of the lines
+ cv::namedWindow("Matches");
+ cv::imshow("Matches",imageMatches);
+
+ // Convert keypoints into Point2f
+ std::vector<cv::Point2f> points1, points2;
+
+ for (std::vector<cv::DMatch>::const_iterator it= matches.begin();
+ it!= matches.end(); ++it) {
+
+ // Get the position of left keypoints
+ float x= keypoints1[it->queryIdx].pt.x;
+ float y= keypoints1[it->queryIdx].pt.y;
+ points1.push_back(cv::Point2f(x,y));
+ cv::circle(image1,cv::Point(x,y),3,cv::Scalar(255,255,255),3);
+ // Get the position of right keypoints
+ x= keypoints2[it->trainIdx].pt.x;
+ y= keypoints2[it->trainIdx].pt.y;
+ cv::circle(image2,cv::Point(x,y),3,cv::Scalar(255,255,255),3);
+ points2.push_back(cv::Point2f(x,y));
+ }
+
+ // Draw the epipolar lines
+ std::vector<cv::Vec3f> lines1;
+ cv::computeCorrespondEpilines(cv::Mat(points1),1,fundemental,lines1);
+
+ for (vector<cv::Vec3f>::const_iterator it= lines1.begin();
+ it!=lines1.end(); ++it) {
+
+ cv::line(image2,cv::Point(0,-(*it)[2]/(*it)[1]),
+ cv::Point(image2.cols,-((*it)[2]+(*it)[0]*image2.cols)/(*it)[1]),
+ cv::Scalar(255,255,255));
+ }
+
+ std::vector<cv::Vec3f> lines2;
+ cv::computeCorrespondEpilines(cv::Mat(points2),2,fundemental,lines2);
+
+ for (vector<cv::Vec3f>::const_iterator it= lines2.begin();
+ it!=lines2.end(); ++it) {
+
+ cv::line(image1,cv::Point(0,-(*it)[2]/(*it)[1]),
+ cv::Point(image1.cols,-((*it)[2]+(*it)[0]*image1.cols)/(*it)[1]),
+ cv::Scalar(255,255,255));
+ }
+
+ // Display the images with epipolar lines
+ cv::namedWindow("Right Image Epilines (RANSAC)");
+ cv::imshow("Right Image Epilines (RANSAC)",image1);
+ cv::namedWindow("Left Image Epilines (RANSAC)");
+ cv::imshow("Left Image Epilines (RANSAC)",image2);
+
+ cv::waitKey();
+ return 0;
+}
\ No newline at end of file
/Chapter 09/robustmatching.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: 3241OS_images/images/baboon4.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/baboon4.jpg
===================================================================
--- 3241OS_images/images/baboon4.jpg (revision 0)
+++ 3241OS_images/images/baboon4.jpg (revision 3)
/3241OS_images/images/baboon4.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/waves.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/waves.jpg
===================================================================
--- 3241OS_images/images/waves.jpg (revision 0)
+++ 3241OS_images/images/waves.jpg (revision 3)
/3241OS_images/images/waves.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/building.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/building.jpg
===================================================================
--- 3241OS_images/images/building.jpg (revision 0)
+++ 3241OS_images/images/building.jpg (revision 3)
/3241OS_images/images/building.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/logo.bmp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/logo.bmp
===================================================================
--- 3241OS_images/images/logo.bmp (revision 0)
+++ 3241OS_images/images/logo.bmp (revision 3)
/3241OS_images/images/logo.bmp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/binaryGroup.bmp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/binaryGroup.bmp
===================================================================
--- 3241OS_images/images/binaryGroup.bmp (revision 0)
+++ 3241OS_images/images/binaryGroup.bmp (revision 3)
/3241OS_images/images/binaryGroup.bmp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/tower.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/tower.jpg
===================================================================
--- 3241OS_images/images/tower.jpg (revision 0)
+++ 3241OS_images/images/tower.jpg (revision 3)
/3241OS_images/images/tower.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/beach.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/beach.jpg
===================================================================
--- 3241OS_images/images/beach.jpg (revision 0)
+++ 3241OS_images/images/beach.jpg (revision 3)
/3241OS_images/images/beach.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/boldt.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/boldt.jpg
===================================================================
--- 3241OS_images/images/boldt.jpg (revision 0)
+++ 3241OS_images/images/boldt.jpg (revision 3)
/3241OS_images/images/boldt.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/bear.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/bear.jpg
===================================================================
--- 3241OS_images/images/bear.jpg (revision 0)
+++ 3241OS_images/images/bear.jpg (revision 3)
/3241OS_images/images/bear.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/bike.avi
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/bike.avi
===================================================================
--- 3241OS_images/images/bike.avi (revision 0)
+++ 3241OS_images/images/bike.avi (revision 3)
/3241OS_images/images/bike.avi
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/sagouine.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/sagouine.jpg
===================================================================
--- 3241OS_images/images/sagouine.jpg (revision 0)
+++ 3241OS_images/images/sagouine.jpg (revision 3)
/3241OS_images/images/sagouine.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/puppy.bmp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/puppy.bmp
===================================================================
--- 3241OS_images/images/puppy.bmp (revision 0)
+++ 3241OS_images/images/puppy.bmp (revision 3)
/3241OS_images/images/puppy.bmp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/marais.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/marais.jpg
===================================================================
--- 3241OS_images/images/marais.jpg (revision 0)
+++ 3241OS_images/images/marais.jpg (revision 3)
/3241OS_images/images/marais.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/lake.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/lake.jpg
===================================================================
--- 3241OS_images/images/lake.jpg (revision 0)
+++ 3241OS_images/images/lake.jpg (revision 3)
/3241OS_images/images/lake.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/church01.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/church01.jpg
===================================================================
--- 3241OS_images/images/church01.jpg (revision 0)
+++ 3241OS_images/images/church01.jpg (revision 3)
/3241OS_images/images/church01.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/church02.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/church02.jpg
===================================================================
--- 3241OS_images/images/church02.jpg (revision 0)
+++ 3241OS_images/images/church02.jpg (revision 3)
/3241OS_images/images/church02.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/church03.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/church03.jpg
===================================================================
--- 3241OS_images/images/church03.jpg (revision 0)
+++ 3241OS_images/images/church03.jpg (revision 3)
/3241OS_images/images/church03.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/monument1.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/monument1.jpg
===================================================================
--- 3241OS_images/images/monument1.jpg (revision 0)
+++ 3241OS_images/images/monument1.jpg (revision 3)
/3241OS_images/images/monument1.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/monument2.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/monument2.jpg
===================================================================
--- 3241OS_images/images/monument2.jpg (revision 0)
+++ 3241OS_images/images/monument2.jpg (revision 3)
/3241OS_images/images/monument2.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/road.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/road.jpg
===================================================================
--- 3241OS_images/images/road.jpg (revision 0)
+++ 3241OS_images/images/road.jpg (revision 3)
/3241OS_images/images/road.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/fundy.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/fundy.jpg
===================================================================
--- 3241OS_images/images/fundy.jpg (revision 0)
+++ 3241OS_images/images/fundy.jpg (revision 3)
/3241OS_images/images/fundy.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/rain.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/rain.jpg
===================================================================
--- 3241OS_images/images/rain.jpg (revision 0)
+++ 3241OS_images/images/rain.jpg (revision 3)
/3241OS_images/images/rain.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chariot.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chariot.jpg
===================================================================
--- 3241OS_images/images/chariot.jpg (revision 0)
+++ 3241OS_images/images/chariot.jpg (revision 3)
/3241OS_images/images/chariot.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/group.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/group.jpg
===================================================================
--- 3241OS_images/images/group.jpg (revision 0)
+++ 3241OS_images/images/group.jpg (revision 3)
/3241OS_images/images/group.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/canal1.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/canal1.jpg
===================================================================
--- 3241OS_images/images/canal1.jpg (revision 0)
+++ 3241OS_images/images/canal1.jpg (revision 3)
/3241OS_images/images/canal1.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/canal2.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/canal2.jpg
===================================================================
--- 3241OS_images/images/canal2.jpg (revision 0)
+++ 3241OS_images/images/canal2.jpg (revision 3)
/3241OS_images/images/canal2.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/dog.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/dog.jpg
===================================================================
--- 3241OS_images/images/dog.jpg (revision 0)
+++ 3241OS_images/images/dog.jpg (revision 3)
/3241OS_images/images/dog.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/tiger.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/tiger.jpg
===================================================================
--- 3241OS_images/images/tiger.jpg (revision 0)
+++ 3241OS_images/images/tiger.jpg (revision 3)
/3241OS_images/images/tiger.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/parliament1.bmp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/parliament1.bmp
===================================================================
--- 3241OS_images/images/parliament1.bmp (revision 0)
+++ 3241OS_images/images/parliament1.bmp (revision 3)
/3241OS_images/images/parliament1.bmp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/parliament2.bmp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/parliament2.bmp
===================================================================
--- 3241OS_images/images/parliament2.bmp (revision 0)
+++ 3241OS_images/images/parliament2.bmp (revision 3)
/3241OS_images/images/parliament2.bmp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/polar.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/polar.jpg
===================================================================
--- 3241OS_images/images/polar.jpg (revision 0)
+++ 3241OS_images/images/polar.jpg (revision 3)
/3241OS_images/images/polar.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/parliament3.bmp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/parliament3.bmp
===================================================================
--- 3241OS_images/images/parliament3.bmp (revision 0)
+++ 3241OS_images/images/parliament3.bmp (revision 3)
/3241OS_images/images/parliament3.bmp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/baboon1.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/baboon1.jpg
===================================================================
--- 3241OS_images/images/baboon1.jpg (revision 0)
+++ 3241OS_images/images/baboon1.jpg (revision 3)
/3241OS_images/images/baboon1.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard01.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard01.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard01.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard01.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard01.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard20.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard20.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard20.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard20.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard20.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard02.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard02.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard02.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard02.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard02.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard21.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard21.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard21.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard21.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard21.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard03.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard03.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard03.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard03.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard03.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard22.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard22.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard22.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard22.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard22.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard04.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard04.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard04.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard04.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard04.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard40.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard40.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard40.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard40.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard40.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard23.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard23.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard23.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard23.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard23.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard05.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard05.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard05.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard05.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard05.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard41.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard41.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard41.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard41.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard41.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard24.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard24.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard24.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard24.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard24.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard06.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard06.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard06.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard06.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard06.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard42.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard42.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard42.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard42.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard42.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard43.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard43.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard43.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard43.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard43.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard25.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard25.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard25.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard25.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard25.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard07.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard07.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard07.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard07.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard07.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard08.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard08.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard08.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard08.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard08.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard26.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard26.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard26.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard26.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard26.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard09.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard09.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard09.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard09.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard09.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard27.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard27.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard27.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard27.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard27.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard28.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard28.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard28.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard28.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard28.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard29.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard29.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard29.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard29.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard29.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard10.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard10.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard10.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard10.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard10.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard11.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard11.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard11.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard11.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard11.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard12.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard12.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard12.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard12.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard12.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard30.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard30.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard30.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard30.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard30.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard13.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard13.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard13.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard13.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard13.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard31.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard31.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard31.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard31.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard31.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard14.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard14.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard14.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard14.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard14.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard32.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard32.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard32.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard32.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard32.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard15.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard15.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard15.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard15.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard15.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard33.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard33.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard33.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard33.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard33.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard16.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard16.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard16.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard16.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard16.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard34.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard34.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard34.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard34.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard34.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard17.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard17.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard17.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard17.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard17.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard35.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard35.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard35.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard35.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard35.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard18.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard18.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard18.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard18.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard18.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard36.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard36.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard36.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard36.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard36.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard19.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard19.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard19.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard19.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard19.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard37.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard37.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard37.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard37.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard37.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard38.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard38.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard38.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard38.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard38.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/chessboards/chessboard39.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/chessboards/chessboard39.jpg
===================================================================
--- 3241OS_images/images/chessboards/chessboard39.jpg (revision 0)
+++ 3241OS_images/images/chessboards/chessboard39.jpg (revision 3)
/3241OS_images/images/chessboards/chessboard39.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/binary.bmp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/binary.bmp
===================================================================
--- 3241OS_images/images/binary.bmp (revision 0)
+++ 3241OS_images/images/binary.bmp (revision 3)
/3241OS_images/images/binary.bmp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/baboon2.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/baboon2.jpg
===================================================================
--- 3241OS_images/images/baboon2.jpg (revision 0)
+++ 3241OS_images/images/baboon2.jpg (revision 3)
/3241OS_images/images/baboon2.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/moose.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/moose.jpg
===================================================================
--- 3241OS_images/images/moose.jpg (revision 0)
+++ 3241OS_images/images/moose.jpg (revision 3)
/3241OS_images/images/moose.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: 3241OS_images/images/baboon3.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 3241OS_images/images/baboon3.jpg
===================================================================
--- 3241OS_images/images/baboon3.jpg (revision 0)
+++ 3241OS_images/images/baboon3.jpg (revision 3)
/3241OS_images/images/baboon3.jpg
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: Chapter 01/myQtConsoleProject.pro
===================================================================
--- Chapter 01/myQtConsoleProject.pro (revision 0)
+++ Chapter 01/myQtConsoleProject.pro (revision 3)
@@ -0,0 +1,25 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator
+#
+#-------------------------------------------------
+
+QT -= gui
+
+TARGET = myQtConsoleProject
+CONFIG += console
+CONFIG -= app_bundle
+
+TEMPLATE = app
+
+
+SOURCES += main.cpp
+
+INCLUDEPATH += C:\OpenCV2.2\include\
+
+LIBS += -LC:\OpenCV2.2\lib \
+ -lopencv_core220 \
+ -lopencv_highgui220 \
+ -lopencv_imgproc220 \
+ -lopencv_features2d220 \
+ -lopencv_calib3d220
Index: Chapter 01/main1.cpp
===================================================================
--- Chapter 01/main1.cpp (revision 0)
+++ Chapter 01/main1.cpp (revision 3)
@@ -0,0 +1,33 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+int main() {
+
+ // read an image
+ cv::Mat image= cv::imread("img.jpg");
+ // create image window named "My Image"
+ cv::namedWindow("My Image");
+ // show the image on window
+ cv::imshow("My Image", image);
+ // wait key for 5000 ms
+ cv::waitKey(5000);
+
+ return 1;
+}
/Chapter 01/main1.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/main2.cpp
===================================================================
--- Chapter 01/main2.cpp (revision 0)
+++ Chapter 01/main2.cpp (revision 3)
@@ -0,0 +1,92 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+// function that creates and returns an image
+cv::Mat function() {
+
+ // create image
+ cv::Mat ima(240,320,CV_8U,cv::Scalar(100));
+ // return it
+ return ima;
+}
+
+int main() {
+
+ // create image
+ cv::Mat image;
+ // print image size
+ std::cout << "size: " << image.size().height << " , "
+ << image.size().width << std::endl;
+ // open image
+ image= cv::imread("img.jpg");
+ // check if image has been successfully read
+ if (!image.data) {
+ // no image has been createdÂ…
+ return 0;
+ }
+ // print image size
+ std::cout << "size (after reading): " << image.size().height << " , "
+ << image.size().width << std::endl;
+
+ // display image
+ cv::namedWindow("Original Image"); // define the window
+ cv::imshow("Original Image", image); // show the image
+
+ // create another image
+ cv::Mat result;
+ // flip the image
+ cv::flip(image,result,1); // positive for horizontal
+ // 0 for vertical,
+ // negative for both
+ // display result
+ cv::namedWindow("Output Image");
+ cv::imshow("Output Image", result);
+ // wait for key pressed
+ cv::waitKey(0);
+ // write image on file
+ cv::imwrite("output.bmp", result);
+
+ // create two new images
+ cv::Mat image2, image3;
+
+ image2= result; // the two images refer to the same data
+ result.copyTo(image3); // a new copy is created
+
+ // flip vertically this time
+ cv::flip(result,result,0);
+
+ // display result
+ cv::namedWindow("image 2");
+ cv::imshow("image 2", image2);
+ cv::namedWindow("image 3");
+ cv::imshow("image 3", image3);
+
+ // get a gray-level image
+ cv::Mat gray= function();
+ // display result
+ cv::namedWindow("Gray Image");
+ cv::imshow("Gray Image", gray);
+
+ // wait for key pressed
+ cv::waitKey(0);
+ return 1;
+}
+
/Chapter 01/main2.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/anotherQtGUI/mainwindow.ui
===================================================================
--- Chapter 01/anotherQtGUI/mainwindow.ui (revision 0)
+++ Chapter 01/anotherQtGUI/mainwindow.ui (revision 3)
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>572</width>
+ <height>326</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralWidget">
+ <widget class="QPushButton" name="pushButton">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>111</width>
+ <height>51</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Open Image</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="pushButton_2">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>70</y>
+ <width>111</width>
+ <height>51</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Process</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>10</y>
+ <width>391</width>
+ <height>261</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Image</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>572</width>
+ <height>25</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QToolBar" name="mainToolBar">
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ <widget class="QStatusBar" name="statusBar"/>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
Index: Chapter 01/anotherQtGUI/anotherQtGUI.pro
===================================================================
--- Chapter 01/anotherQtGUI/anotherQtGUI.pro (revision 0)
+++ Chapter 01/anotherQtGUI/anotherQtGUI.pro (revision 3)
@@ -0,0 +1,25 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2010-06-30T08:18:42
+#
+#-------------------------------------------------
+
+TARGET = anotherQtGUI
+TEMPLATE = app
+
+
+SOURCES += main.cpp\
+ mainwindow.cpp
+
+HEADERS += mainwindow.h
+
+FORMS += mainwindow.ui
+
+INCLUDEPATH += C:\OpenCV2.2\include\
+
+LIBS += -LC:\OpenCV2.2\lib \
+ -lopencv_core220 \
+ -lopencv_highgui220 \
+ -lopencv_imgproc220 \
+ -lopencv_features2d220 \
+ -lopencv_calib3d220
Index: Chapter 01/anotherQtGUI/Makefile.Release
===================================================================
--- Chapter 01/anotherQtGUI/Makefile.Release (revision 0)
+++ Chapter 01/anotherQtGUI/Makefile.Release (revision 3)
@@ -0,0 +1,176 @@
+#############################################################################
+# Makefile for building: anotherQtGUI
+# Generated by qmake (2.01a) (Qt 4.6.3) on: Thu Aug 5 11:10:44 2010
+# Project: anotherQtGUI.pro
+# Template: app
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cl
+CXX = cl
+DEFINES = -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT
+CFLAGS = -nologo -Zm200 -Zc:wchar_t- -O2 -MD -W3 $(DEFINES)
+CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -O2 -MD -GR -EHsc -W3 -w34100 -w34189 $(DEFINES)
+INCPATH = -I"..\..\Qt\4.6.3\include\QtCore" -I"..\..\Qt\4.6.3\include\QtGui" -I"..\..\Qt\4.6.3\include" -I"..\..\OpenCV2.1\include\opencv" -I"..\..\Qt\4.6.3\include\ActiveQt" -I"release" -I"." -I"..\..\Qt\4.6.3\mkspecs\win32-msvc2008"
+LINK = link
+LFLAGS = /LIBPATH:"c:\Qt\4.6.3\lib" /NOLOGO /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"release\anotherQtGUI.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
+LIBS = c:\Qt\4.6.3\lib\qtmain.lib /LIBPATH:C:\OpenCV2.1\lib C:\OpenCV2.1\lib\cv210.lib C:\OpenCV2.1\lib\cxcore210.lib C:\OpenCV2.1\lib\highgui210.lib c:\Qt\4.6.3\lib\QtGui4.lib c:\Qt\4.6.3\lib\QtCore4.lib
+QMAKE = c:\Qt\4.6.3\bin\qmake.exe
+IDC = c:\Qt\4.6.3\bin\idc.exe
+IDL = midl
+ZIP = zip -r -9
+DEF_FILE =
+RES_FILE =
+COPY = copy /y
+COPY_FILE = $(COPY)
+COPY_DIR = xcopy /s /q /y /i
+DEL_FILE = del
+DEL_DIR = rmdir
+MOVE = move
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_PROGRAM = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+
+####### Output directory
+
+OBJECTS_DIR = release
+
+####### Files
+
+SOURCES = main.cpp \
+ mainwindow.cpp release\moc_mainwindow.cpp
+OBJECTS = release\main.obj \
+ release\mainwindow.obj \
+ release\moc_mainwindow.obj
+DIST =
+QMAKE_TARGET = anotherQtGUI
+DESTDIR = release\ #avoid trailing-slash linebreak
+TARGET = anotherQtGUI.exe
+DESTDIR_TARGET = release\anotherQtGUI.exe
+
+####### Implicit rules
+
+.SUFFIXES: .c .cpp .cc .cxx
+
+{release}.cpp{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{release}.cc{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{release}.cxx{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{release}.c{release\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.cpp{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.cc{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.cxx{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.c{release\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+####### Build rules
+
+first: all
+all: Makefile.Release $(DESTDIR_TARGET)
+
+$(DESTDIR_TARGET): ui_mainwindow.h $(OBJECTS)
+ $(LINK) $(LFLAGS) /OUT:$(DESTDIR_TARGET) @<<
+ $(OBJECTS) $(LIBS)
+<<
+ mt.exe -nologo -manifest "release\anotherQtGUI.intermediate.manifest" -outputresource:$(DESTDIR_TARGET);1
+
+
+
+qmake: FORCE
+ @$(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile.Release anotherQtGUI.pro
+
+dist:
+ $(ZIP) anotherQtGUI.zip $(SOURCES) $(DIST) anotherQtGUI.pro ..\..\Qt\4.6.3\mkspecs\qconfig.pri ..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf ..\..\Qt\4.6.3\mkspecs\features\qt_config.prf ..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf ..\..\Qt\4.6.3\mkspecs\features\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\release.prf ..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf ..\..\Qt\4.6.3\mkspecs\features\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\build_pass.prf ..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf ..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf ..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf ..\..\Qt\4.6.3\mkspecs\features\shared.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf ..\..\Qt\4.6.3\mkspecs\features\warn_on.prf ..\..\Qt\4.6.3\mkspecs\features\qt.prf ..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf ..\..\Qt\4.6.3\mkspecs\features\moc.prf ..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf ..\..\Qt\4.6.3\mkspecs\features\resources.prf ..\..\Qt\4.6.3\mkspecs\features\uic.prf ..\..\Qt\4.6.3\mkspecs\features\yacc.prf ..\..\Qt\4.6.3\mkspecs\features\lex.prf ..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf ..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf c:\Qt\4.6.3\lib\qtmain.prl HEADERS RESOURCES IMAGES SOURCES OBJECTIVE_SOURCES FORMS YACCSOURCES YACCSOURCES LEXSOURCES
+
+clean: compiler_clean
+ -$(DEL_FILE) release\main.obj release\mainwindow.obj release\moc_mainwindow.obj
+ -$(DEL_FILE) release\anotherQtGUI.intermediate.manifest release\anotherQtGUI.exp
+
+distclean: clean
+ -$(DEL_FILE) $(DESTDIR_TARGET)
+ -$(DEL_FILE) Makefile.Release
+
+check: first
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_moc_header_make_all: release\moc_mainwindow.cpp
+compiler_moc_header_clean:
+ -$(DEL_FILE) release\moc_mainwindow.cpp
+release\moc_mainwindow.cpp: mainwindow.h
+ C:\Qt\4.6.3\bin\moc.exe $(DEFINES) $(INCPATH) -D_MSC_VER=1500 -DWIN32 mainwindow.h -o release\moc_mainwindow.cpp
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_image_collection_make_all: qmake_image_collection.cpp
+compiler_image_collection_clean:
+ -$(DEL_FILE) qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_uic_make_all: ui_mainwindow.h
+compiler_uic_clean:
+ -$(DEL_FILE) ui_mainwindow.h
+ui_mainwindow.h: mainwindow.ui
+ c:\Qt\4.6.3\bin\uic.exe mainwindow.ui -o ui_mainwindow.h
+
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_header_clean compiler_uic_clean
+
+
+
+####### Compile
+
+release\main.obj: main.cpp mainwindow.h
+
+release\mainwindow.obj: mainwindow.cpp mainwindow.h \
+ ui_mainwindow.h
+
+release\moc_mainwindow.obj: release\moc_mainwindow.cpp
+
+####### Install
+
+install: FORCE
+
+uninstall: FORCE
+
+FORCE:
+
Index: Chapter 01/anotherQtGUI/Makefile
===================================================================
--- Chapter 01/anotherQtGUI/Makefile (revision 0)
+++ Chapter 01/anotherQtGUI/Makefile (revision 3)
@@ -0,0 +1,153 @@
+#############################################################################
+# Makefile for building: anotherQtGUI
+# Generated by qmake (2.01a) (Qt 4.6.3) on: Thu Aug 5 11:10:44 2010
+# Project: anotherQtGUI.pro
+# Template: app
+# Command: c:\Qt\4.6.3\bin\qmake.exe -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile anotherQtGUI.pro
+#############################################################################
+
+first: release
+install: release-install
+uninstall: release-uninstall
+MAKEFILE = Makefile
+QMAKE = c:\Qt\4.6.3\bin\qmake.exe
+DEL_FILE = del
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+COPY = copy /y
+COPY_FILE = $(COPY)
+COPY_DIR = xcopy /s /q /y /i
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_PROGRAM = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+DEL_FILE = del
+SYMLINK =
+DEL_DIR = rmdir
+MOVE = move
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+SUBTARGETS = \
+ release \
+ debug
+
+release: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release
+release-make_default: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release
+release-make_first: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release first
+release-all: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release all
+release-clean: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release clean
+release-distclean: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release distclean
+release-install: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release install
+release-uninstall: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release uninstall
+debug: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug
+debug-make_default: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug
+debug-make_first: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug first
+debug-all: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug all
+debug-clean: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug clean
+debug-distclean: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug distclean
+debug-install: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug install
+debug-uninstall: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug uninstall
+
+Makefile: anotherQtGUI.pro ..\..\Qt\4.6.3\mkspecs\win32-msvc2008\qmake.conf ..\..\Qt\4.6.3\mkspecs\qconfig.pri \
+ ..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\qt_config.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\default_pre.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\release.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\default_post.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\shared.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\warn_on.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\qt.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\moc.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\resources.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\uic.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\yacc.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\lex.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf \
+ c:\Qt\4.6.3\lib\qtmain.prl
+ $(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile anotherQtGUI.pro
+..\..\Qt\4.6.3\mkspecs\qconfig.pri:
+..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf:
+..\..\Qt\4.6.3\mkspecs\features\qt_config.prf:
+..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf:
+..\..\Qt\4.6.3\mkspecs\features\default_pre.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf:
+..\..\Qt\4.6.3\mkspecs\features\release.prf:
+..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf:
+..\..\Qt\4.6.3\mkspecs\features\default_post.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf:
+..\..\Qt\4.6.3\mkspecs\features\shared.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf:
+..\..\Qt\4.6.3\mkspecs\features\warn_on.prf:
+..\..\Qt\4.6.3\mkspecs\features\qt.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf:
+..\..\Qt\4.6.3\mkspecs\features\moc.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf:
+..\..\Qt\4.6.3\mkspecs\features\resources.prf:
+..\..\Qt\4.6.3\mkspecs\features\uic.prf:
+..\..\Qt\4.6.3\mkspecs\features\yacc.prf:
+..\..\Qt\4.6.3\mkspecs\features\lex.prf:
+..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf:
+..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf:
+c:\Qt\4.6.3\lib\qtmain.prl:
+qmake: qmake_all FORCE
+ @$(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile anotherQtGUI.pro
+
+qmake_all: FORCE
+
+make_default: release-make_default debug-make_default FORCE
+make_first: release-make_first debug-make_first FORCE
+all: release-all debug-all FORCE
+clean: release-clean debug-clean FORCE
+ -$(DEL_FILE) ".\anotherQtGUI.intermediate.manifest"
+ -$(DEL_FILE) anotherQtGUI.exp
+distclean: release-distclean debug-distclean FORCE
+ -$(DEL_FILE) Makefile
+
+check: first
+
+release-mocclean: $(MAKEFILE).Release
+ $(MAKE) -f $(MAKEFILE).Release mocclean
+debug-mocclean: $(MAKEFILE).Debug
+ $(MAKE) -f $(MAKEFILE).Debug mocclean
+mocclean: release-mocclean debug-mocclean
+
+release-mocables: $(MAKEFILE).Release
+ $(MAKE) -f $(MAKEFILE).Release mocables
+debug-mocables: $(MAKEFILE).Debug
+ $(MAKE) -f $(MAKEFILE).Debug mocables
+mocables: release-mocables debug-mocables
+FORCE:
+
+$(MAKEFILE).Release: Makefile
+$(MAKEFILE).Debug: Makefile
Index: Chapter 01/anotherQtGUI/mainwindow.cpp
===================================================================
--- Chapter 01/anotherQtGUI/mainwindow.cpp (revision 0)
+++ Chapter 01/anotherQtGUI/mainwindow.cpp (revision 3)
@@ -0,0 +1,55 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+MainWindow::MainWindow(QWidget *parent)
+ : QMainWindow(parent), ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+ ui->pushButton_2->setEnabled(false);
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+}
+
+void MainWindow::on_pushButton_clicked()
+{
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.bmp)"));
+
+ image= cv::imread(fileName.toAscii().data());
+
+ if (image.data) {
+ cv::namedWindow("Original Image");
+ cv::imshow("Original Image", image);
+ ui->pushButton_2->setEnabled(true);
+ }
+}
+
+void MainWindow::on_pushButton_2_clicked()
+{
+ cv::flip(image,image,1); // process the image
+
+ cv::cvtColor(image,image,CV_BGR2RGB); // change color channel ordering
+ QImage img= QImage((const unsigned char*)(image.data), // Qt image structure
+ image.cols,image.rows,QImage::Format_RGB888);
+ ui->label->setPixmap(QPixmap::fromImage(img)); // display on label
+ ui->label->resize(ui->label->pixmap()->size()); // resize the label to fit the image
+}
/Chapter 01/anotherQtGUI/mainwindow.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/anotherQtGUI/ui_mainwindow.h
===================================================================
--- Chapter 01/anotherQtGUI/ui_mainwindow.h (revision 0)
+++ Chapter 01/anotherQtGUI/ui_mainwindow.h (revision 3)
@@ -0,0 +1,104 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+/********************************************************************************
+** Form generated from reading UI file 'mainwindow.ui'
+**
+** Created: Wed Jun 30 08:35:07 2010
+** by: Qt User Interface Compiler version 4.6.3
+**
+** WARNING! All changes made in this file will be lost when recompiling UI file!
+********************************************************************************/
+
+#ifndef UI_MAINWINDOW_H
+#define UI_MAINWINDOW_H
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QHeaderView>
+#include <QtGui/QLabel>
+#include <QtGui/QMainWindow>
+#include <QtGui/QMenuBar>
+#include <QtGui/QPushButton>
+#include <QtGui/QStatusBar>
+#include <QtGui/QToolBar>
+#include <QtGui/QWidget>
+
+QT_BEGIN_NAMESPACE
+
+class Ui_MainWindow
+{
+public:
+ QWidget *centralWidget;
+ QPushButton *pushButton;
+ QPushButton *pushButton_2;
+ QLabel *label;
+ QMenuBar *menuBar;
+ QToolBar *mainToolBar;
+ QStatusBar *statusBar;
+
+ void setupUi(QMainWindow *MainWindow)
+ {
+ if (MainWindow->objectName().isEmpty())
+ MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
+ MainWindow->resize(572, 326);
+ centralWidget = new QWidget(MainWindow);
+ centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
+ pushButton = new QPushButton(centralWidget);
+ pushButton->setObjectName(QString::fromUtf8("pushButton"));
+ pushButton->setGeometry(QRect(10, 10, 111, 51));
+ pushButton_2 = new QPushButton(centralWidget);
+ pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
+ pushButton_2->setGeometry(QRect(10, 70, 111, 51));
+ label = new QLabel(centralWidget);
+ label->setObjectName(QString::fromUtf8("label"));
+ label->setGeometry(QRect(160, 10, 391, 261));
+ MainWindow->setCentralWidget(centralWidget);
+ menuBar = new QMenuBar(MainWindow);
+ menuBar->setObjectName(QString::fromUtf8("menuBar"));
+ menuBar->setGeometry(QRect(0, 0, 572, 25));
+ MainWindow->setMenuBar(menuBar);
+ mainToolBar = new QToolBar(MainWindow);
+ mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
+ MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
+ statusBar = new QStatusBar(MainWindow);
+ statusBar->setObjectName(QString::fromUtf8("statusBar"));
+ MainWindow->setStatusBar(statusBar);
+
+ retranslateUi(MainWindow);
+
+ QMetaObject::connectSlotsByName(MainWindow);
+ } // setupUi
+
+ void retranslateUi(QMainWindow *MainWindow)
+ {
+ MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
+ pushButton->setText(QApplication::translate("MainWindow", "Open Image", 0, QApplication::UnicodeUTF8));
+ pushButton_2->setText(QApplication::translate("MainWindow", "Process", 0, QApplication::UnicodeUTF8));
+ label->setText(QApplication::translate("MainWindow", "Image", 0, QApplication::UnicodeUTF8));
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class MainWindow: public Ui_MainWindow {};
+} // namespace Ui
+
+QT_END_NAMESPACE
+
+#endif // UI_MAINWINDOW_H
/Chapter 01/anotherQtGUI/ui_mainwindow.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/anotherQtGUI/Makefile.Debug
===================================================================
--- Chapter 01/anotherQtGUI/Makefile.Debug (revision 0)
+++ Chapter 01/anotherQtGUI/Makefile.Debug (revision 3)
@@ -0,0 +1,176 @@
+#############################################################################
+# Makefile for building: anotherQtGUI
+# Generated by qmake (2.01a) (Qt 4.6.3) on: Thu Aug 5 11:10:44 2010
+# Project: anotherQtGUI.pro
+# Template: app
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cl
+CXX = cl
+DEFINES = -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT
+CFLAGS = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 $(DEFINES)
+CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 $(DEFINES)
+INCPATH = -I"..\..\Qt\4.6.3\include\QtCore" -I"..\..\Qt\4.6.3\include\QtGui" -I"..\..\Qt\4.6.3\include" -I"..\..\OpenCV2.1\include\opencv" -I"..\..\Qt\4.6.3\include\ActiveQt" -I"debug" -I"." -I"..\..\Qt\4.6.3\mkspecs\win32-msvc2008"
+LINK = link
+LFLAGS = /LIBPATH:"c:\Qt\4.6.3\lib" /NOLOGO /DEBUG /MANIFEST /MANIFESTFILE:"debug\anotherQtGUI.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
+LIBS = c:\Qt\4.6.3\lib\qtmaind.lib /LIBPATH:C:\OpenCV2.1\lib C:\OpenCV2.1\lib\cv210.lib C:\OpenCV2.1\lib\cxcore210.lib C:\OpenCV2.1\lib\highgui210.lib c:\Qt\4.6.3\lib\QtGuid4.lib c:\Qt\4.6.3\lib\QtCored4.lib
+QMAKE = c:\Qt\4.6.3\bin\qmake.exe
+IDC = c:\Qt\4.6.3\bin\idc.exe
+IDL = midl
+ZIP = zip -r -9
+DEF_FILE =
+RES_FILE =
+COPY = copy /y
+COPY_FILE = $(COPY)
+COPY_DIR = xcopy /s /q /y /i
+DEL_FILE = del
+DEL_DIR = rmdir
+MOVE = move
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_PROGRAM = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+
+####### Output directory
+
+OBJECTS_DIR = debug
+
+####### Files
+
+SOURCES = main.cpp \
+ mainwindow.cpp debug\moc_mainwindow.cpp
+OBJECTS = debug\main.obj \
+ debug\mainwindow.obj \
+ debug\moc_mainwindow.obj
+DIST =
+QMAKE_TARGET = anotherQtGUI
+DESTDIR = debug\ #avoid trailing-slash linebreak
+TARGET = anotherQtGUI.exe
+DESTDIR_TARGET = debug\anotherQtGUI.exe
+
+####### Implicit rules
+
+.SUFFIXES: .c .cpp .cc .cxx
+
+{.}.cpp{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{.}.cc{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{.}.cxx{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{.}.c{debug\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.cpp{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.cc{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.cxx{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.c{debug\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+####### Build rules
+
+first: all
+all: Makefile.Debug $(DESTDIR_TARGET)
+
+$(DESTDIR_TARGET): ui_mainwindow.h $(OBJECTS)
+ $(LINK) $(LFLAGS) /OUT:$(DESTDIR_TARGET) @<<
+ $(OBJECTS) $(LIBS)
+<<
+ mt.exe -nologo -manifest "debug\anotherQtGUI.intermediate.manifest" -outputresource:$(DESTDIR_TARGET);1
+
+
+
+qmake: FORCE
+ @$(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile.Debug anotherQtGUI.pro
+
+dist:
+ $(ZIP) anotherQtGUI.zip $(SOURCES) $(DIST) anotherQtGUI.pro ..\..\Qt\4.6.3\mkspecs\qconfig.pri ..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf ..\..\Qt\4.6.3\mkspecs\features\qt_config.prf ..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf ..\..\Qt\4.6.3\mkspecs\features\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\debug.prf ..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf ..\..\Qt\4.6.3\mkspecs\features\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\build_pass.prf ..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf ..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf ..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf ..\..\Qt\4.6.3\mkspecs\features\shared.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf ..\..\Qt\4.6.3\mkspecs\features\warn_on.prf ..\..\Qt\4.6.3\mkspecs\features\qt.prf ..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf ..\..\Qt\4.6.3\mkspecs\features\moc.prf ..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf ..\..\Qt\4.6.3\mkspecs\features\resources.prf ..\..\Qt\4.6.3\mkspecs\features\uic.prf ..\..\Qt\4.6.3\mkspecs\features\yacc.prf ..\..\Qt\4.6.3\mkspecs\features\lex.prf ..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf ..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf c:\Qt\4.6.3\lib\qtmaind.prl HEADERS RESOURCES IMAGES SOURCES OBJECTIVE_SOURCES FORMS YACCSOURCES YACCSOURCES LEXSOURCES
+
+clean: compiler_clean
+ -$(DEL_FILE) debug\main.obj debug\mainwindow.obj debug\moc_mainwindow.obj
+ -$(DEL_FILE) debug\anotherQtGUI.intermediate.manifest debug\anotherQtGUI.exp debug\anotherQtGUI.pdb debug\anotherQtGUI.ilk vc*.pdb vc*.idb
+
+distclean: clean
+ -$(DEL_FILE) $(DESTDIR_TARGET)
+ -$(DEL_FILE) Makefile.Debug
+
+check: first
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_moc_header_make_all: debug\moc_mainwindow.cpp
+compiler_moc_header_clean:
+ -$(DEL_FILE) debug\moc_mainwindow.cpp
+debug\moc_mainwindow.cpp: mainwindow.h
+ C:\Qt\4.6.3\bin\moc.exe $(DEFINES) $(INCPATH) -D_MSC_VER=1500 -DWIN32 mainwindow.h -o debug\moc_mainwindow.cpp
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_image_collection_make_all: qmake_image_collection.cpp
+compiler_image_collection_clean:
+ -$(DEL_FILE) qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_uic_make_all: ui_mainwindow.h
+compiler_uic_clean:
+ -$(DEL_FILE) ui_mainwindow.h
+ui_mainwindow.h: mainwindow.ui
+ c:\Qt\4.6.3\bin\uic.exe mainwindow.ui -o ui_mainwindow.h
+
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_header_clean compiler_uic_clean
+
+
+
+####### Compile
+
+debug\main.obj: main.cpp mainwindow.h
+
+debug\mainwindow.obj: mainwindow.cpp mainwindow.h \
+ ui_mainwindow.h
+
+debug\moc_mainwindow.obj: debug\moc_mainwindow.cpp
+
+####### Install
+
+install: FORCE
+
+uninstall: FORCE
+
+FORCE:
+
Index: Chapter 01/anotherQtGUI/mainwindow.h
===================================================================
--- Chapter 01/anotherQtGUI/mainwindow.h (revision 0)
+++ Chapter 01/anotherQtGUI/mainwindow.h (revision 3)
@@ -0,0 +1,47 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QtGui/QMainWindow>
+#include <QFileDialog>
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+namespace Ui
+{
+ class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+private:
+ Ui::MainWindow *ui;
+ cv::Mat image; // the image variable
+
+private slots:
+ void on_pushButton_2_clicked();
+ void on_pushButton_clicked();
+};
+
+#endif // MAINWINDOW_H
/Chapter 01/anotherQtGUI/mainwindow.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/anotherQtGUI/main.cpp
===================================================================
--- Chapter 01/anotherQtGUI/main.cpp (revision 0)
+++ Chapter 01/anotherQtGUI/main.cpp (revision 3)
@@ -0,0 +1,27 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <QtGui/QApplication>
+#include "mainwindow.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow w;
+ w.show();
+ return a.exec();
+}
/Chapter 01/anotherQtGUI/main.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/README.txt
===================================================================
--- Chapter 01/README.txt (revision 0)
+++ Chapter 01/README.txt (revision 3)
@@ -0,0 +1,21 @@
+This directory contains material supporting chapter 1 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+
+File:
+ main1.cpp
+correspond to Recipes:
+Creating an OpenCV project with MS Visual C++
+Creating an OpenCV project with Qt
+
+File:
+ main2.cpp
+correspond to Recipe:
+Loading, displaying and saving images
+
+Files in :
+ myQtGUIApp
+ anotherQtGUI
+correspond to Recipe:
+Creating a GUI application using Qt
/Chapter 01/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/myQtGUIApp/mainwindow.ui
===================================================================
--- Chapter 01/myQtGUIApp/mainwindow.ui (revision 0)
+++ Chapter 01/myQtGUIApp/mainwindow.ui (revision 3)
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>262</width>
+ <height>214</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>My Qt Application</string>
+ </property>
+ <widget class="QWidget" name="centralWidget">
+ <widget class="QPushButton" name="pushButton">
+ <property name="geometry">
+ <rect>
+ <x>60</x>
+ <y>20</y>
+ <width>141</width>
+ <height>51</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Open Image</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="pushButton_2">
+ <property name="geometry">
+ <rect>
+ <x>60</x>
+ <y>90</y>
+ <width>141</width>
+ <height>51</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Process</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>262</width>
+ <height>25</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QToolBar" name="mainToolBar">
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ <widget class="QStatusBar" name="statusBar"/>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
Index: Chapter 01/myQtGUIApp/Makefile.Release
===================================================================
--- Chapter 01/myQtGUIApp/Makefile.Release (revision 0)
+++ Chapter 01/myQtGUIApp/Makefile.Release (revision 3)
@@ -0,0 +1,176 @@
+#############################################################################
+# Makefile for building: myQtGUIApp
+# Generated by qmake (2.01a) (Qt 4.6.3) on: Mon Feb 28 15:14:16 2011
+# Project: myQtGUIApp.pro
+# Template: app
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cl
+CXX = cl
+DEFINES = -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT
+CFLAGS = -nologo -Zm200 -Zc:wchar_t- -O2 -MD -W3 $(DEFINES)
+CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -O2 -MD -GR -EHsc -W3 -w34100 -w34189 $(DEFINES)
+INCPATH = -I"..\..\Qt\4.6.3\include\QtCore" -I"..\..\Qt\4.6.3\include\QtGui" -I"..\..\Qt\4.6.3\include" -I"..\..\OpenCV2.2\include" -I"..\..\Qt\4.6.3\include\ActiveQt" -I"release" -I"." -I"..\..\Qt\4.6.3\mkspecs\win32-msvc2008"
+LINK = link
+LFLAGS = /LIBPATH:"c:\Qt\4.6.3\lib" /NOLOGO /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"release\myQtGUIApp.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
+LIBS = c:\Qt\4.6.3\lib\qtmain.lib /LIBPATH:C:\OpenCV2.2\lib C:\OpenCV2.2\lib\opencv_core220.lib C:\OpenCV2.2\lib\opencv_highgui220.lib C:\OpenCV2.2\lib\opencv_imgproc220.lib C:\OpenCV2.2\lib\opencv_features2d220.lib C:\OpenCV2.2\lib\opencv_calib3d220.lib c:\Qt\4.6.3\lib\QtGui4.lib c:\Qt\4.6.3\lib\QtCore4.lib
+QMAKE = c:\Qt\4.6.3\bin\qmake.exe
+IDC = c:\Qt\4.6.3\bin\idc.exe
+IDL = midl
+ZIP = zip -r -9
+DEF_FILE =
+RES_FILE =
+COPY = copy /y
+COPY_FILE = $(COPY)
+COPY_DIR = xcopy /s /q /y /i
+DEL_FILE = del
+DEL_DIR = rmdir
+MOVE = move
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_PROGRAM = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+
+####### Output directory
+
+OBJECTS_DIR = release
+
+####### Files
+
+SOURCES = main.cpp \
+ mainwindow.cpp release\moc_mainwindow.cpp
+OBJECTS = release\main.obj \
+ release\mainwindow.obj \
+ release\moc_mainwindow.obj
+DIST =
+QMAKE_TARGET = myQtGUIApp
+DESTDIR = release\ #avoid trailing-slash linebreak
+TARGET = myQtGUIApp.exe
+DESTDIR_TARGET = release\myQtGUIApp.exe
+
+####### Implicit rules
+
+.SUFFIXES: .c .cpp .cc .cxx
+
+{release}.cpp{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{release}.cc{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{release}.cxx{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{release}.c{release\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.cpp{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.cc{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.cxx{release\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+{.}.c{release\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Forelease\ @<<
+ $<
+<<
+
+####### Build rules
+
+first: all
+all: Makefile.Release $(DESTDIR_TARGET)
+
+$(DESTDIR_TARGET): ui_mainwindow.h $(OBJECTS)
+ $(LINK) $(LFLAGS) /OUT:$(DESTDIR_TARGET) @<<
+ $(OBJECTS) $(LIBS)
+<<
+ mt.exe -nologo -manifest "release\myQtGUIApp.intermediate.manifest" -outputresource:$(DESTDIR_TARGET);1
+
+
+
+qmake: FORCE
+ @$(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile.Release myQtGUIApp.pro
+
+dist:
+ $(ZIP) myQtGUIApp.zip $(SOURCES) $(DIST) myQtGUIApp.pro ..\..\Qt\4.6.3\mkspecs\qconfig.pri ..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf ..\..\Qt\4.6.3\mkspecs\features\qt_config.prf ..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf ..\..\Qt\4.6.3\mkspecs\features\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\release.prf ..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf ..\..\Qt\4.6.3\mkspecs\features\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\build_pass.prf ..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf ..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf ..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf ..\..\Qt\4.6.3\mkspecs\features\shared.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf ..\..\Qt\4.6.3\mkspecs\features\warn_on.prf ..\..\Qt\4.6.3\mkspecs\features\qt.prf ..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf ..\..\Qt\4.6.3\mkspecs\features\moc.prf ..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf ..\..\Qt\4.6.3\mkspecs\features\resources.prf ..\..\Qt\4.6.3\mkspecs\features\uic.prf ..\..\Qt\4.6.3\mkspecs\features\yacc.prf ..\..\Qt\4.6.3\mkspecs\features\lex.prf ..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf ..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf c:\Qt\4.6.3\lib\qtmain.prl HEADERS RESOURCES IMAGES SOURCES OBJECTIVE_SOURCES FORMS YACCSOURCES YACCSOURCES LEXSOURCES
+
+clean: compiler_clean
+ -$(DEL_FILE) release\main.obj release\mainwindow.obj release\moc_mainwindow.obj
+ -$(DEL_FILE) release\myQtGUIApp.intermediate.manifest release\myQtGUIApp.exp
+
+distclean: clean
+ -$(DEL_FILE) $(DESTDIR_TARGET)
+ -$(DEL_FILE) Makefile.Release
+
+check: first
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_moc_header_make_all: release\moc_mainwindow.cpp
+compiler_moc_header_clean:
+ -$(DEL_FILE) release\moc_mainwindow.cpp
+release\moc_mainwindow.cpp: mainwindow.h
+ C:\Qt\4.6.3\bin\moc.exe $(DEFINES) $(INCPATH) -D_MSC_VER=1500 -DWIN32 mainwindow.h -o release\moc_mainwindow.cpp
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_image_collection_make_all: qmake_image_collection.cpp
+compiler_image_collection_clean:
+ -$(DEL_FILE) qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_uic_make_all: ui_mainwindow.h
+compiler_uic_clean:
+ -$(DEL_FILE) ui_mainwindow.h
+ui_mainwindow.h: mainwindow.ui
+ c:\Qt\4.6.3\bin\uic.exe mainwindow.ui -o ui_mainwindow.h
+
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_header_clean compiler_uic_clean
+
+
+
+####### Compile
+
+release\main.obj: main.cpp mainwindow.h
+
+release\mainwindow.obj: mainwindow.cpp mainwindow.h \
+ ui_mainwindow.h
+
+release\moc_mainwindow.obj: release\moc_mainwindow.cpp
+
+####### Install
+
+install: FORCE
+
+uninstall: FORCE
+
+FORCE:
+
Index: Chapter 01/myQtGUIApp/Makefile
===================================================================
--- Chapter 01/myQtGUIApp/Makefile (revision 0)
+++ Chapter 01/myQtGUIApp/Makefile (revision 3)
@@ -0,0 +1,153 @@
+#############################################################################
+# Makefile for building: myQtGUIApp
+# Generated by qmake (2.01a) (Qt 4.6.3) on: Mon Feb 28 15:14:16 2011
+# Project: myQtGUIApp.pro
+# Template: app
+# Command: c:\Qt\4.6.3\bin\qmake.exe -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile myQtGUIApp.pro
+#############################################################################
+
+first: release
+install: release-install
+uninstall: release-uninstall
+MAKEFILE = Makefile
+QMAKE = c:\Qt\4.6.3\bin\qmake.exe
+DEL_FILE = del
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+COPY = copy /y
+COPY_FILE = $(COPY)
+COPY_DIR = xcopy /s /q /y /i
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_PROGRAM = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+DEL_FILE = del
+SYMLINK =
+DEL_DIR = rmdir
+MOVE = move
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+SUBTARGETS = \
+ release \
+ debug
+
+release: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release
+release-make_default: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release
+release-make_first: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release first
+release-all: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release all
+release-clean: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release clean
+release-distclean: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release distclean
+release-install: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release install
+release-uninstall: $(MAKEFILE).Release FORCE
+ $(MAKE) -f $(MAKEFILE).Release uninstall
+debug: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug
+debug-make_default: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug
+debug-make_first: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug first
+debug-all: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug all
+debug-clean: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug clean
+debug-distclean: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug distclean
+debug-install: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug install
+debug-uninstall: $(MAKEFILE).Debug FORCE
+ $(MAKE) -f $(MAKEFILE).Debug uninstall
+
+Makefile: myQtGUIApp.pro ..\..\Qt\4.6.3\mkspecs\win32-msvc2008\qmake.conf ..\..\Qt\4.6.3\mkspecs\qconfig.pri \
+ ..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\qt_config.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\default_pre.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\release.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\default_post.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\shared.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\warn_on.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\qt.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\moc.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\resources.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\uic.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\yacc.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\lex.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf \
+ ..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf \
+ c:\Qt\4.6.3\lib\qtmain.prl
+ $(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile myQtGUIApp.pro
+..\..\Qt\4.6.3\mkspecs\qconfig.pri:
+..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf:
+..\..\Qt\4.6.3\mkspecs\features\qt_config.prf:
+..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf:
+..\..\Qt\4.6.3\mkspecs\features\default_pre.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf:
+..\..\Qt\4.6.3\mkspecs\features\release.prf:
+..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf:
+..\..\Qt\4.6.3\mkspecs\features\default_post.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf:
+..\..\Qt\4.6.3\mkspecs\features\shared.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf:
+..\..\Qt\4.6.3\mkspecs\features\warn_on.prf:
+..\..\Qt\4.6.3\mkspecs\features\qt.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf:
+..\..\Qt\4.6.3\mkspecs\features\moc.prf:
+..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf:
+..\..\Qt\4.6.3\mkspecs\features\resources.prf:
+..\..\Qt\4.6.3\mkspecs\features\uic.prf:
+..\..\Qt\4.6.3\mkspecs\features\yacc.prf:
+..\..\Qt\4.6.3\mkspecs\features\lex.prf:
+..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf:
+..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf:
+c:\Qt\4.6.3\lib\qtmain.prl:
+qmake: qmake_all FORCE
+ @$(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile myQtGUIApp.pro
+
+qmake_all: FORCE
+
+make_default: release-make_default debug-make_default FORCE
+make_first: release-make_first debug-make_first FORCE
+all: release-all debug-all FORCE
+clean: release-clean debug-clean FORCE
+ -$(DEL_FILE) ".\myQtGUIApp.intermediate.manifest"
+ -$(DEL_FILE) myQtGUIApp.exp
+distclean: release-distclean debug-distclean FORCE
+ -$(DEL_FILE) Makefile
+
+check: first
+
+release-mocclean: $(MAKEFILE).Release
+ $(MAKE) -f $(MAKEFILE).Release mocclean
+debug-mocclean: $(MAKEFILE).Debug
+ $(MAKE) -f $(MAKEFILE).Debug mocclean
+mocclean: release-mocclean debug-mocclean
+
+release-mocables: $(MAKEFILE).Release
+ $(MAKE) -f $(MAKEFILE).Release mocables
+debug-mocables: $(MAKEFILE).Debug
+ $(MAKE) -f $(MAKEFILE).Debug mocables
+mocables: release-mocables debug-mocables
+FORCE:
+
+$(MAKEFILE).Release: Makefile
+$(MAKEFILE).Debug: Makefile
Index: Chapter 01/myQtGUIApp/mainwindow.cpp
===================================================================
--- Chapter 01/myQtGUIApp/mainwindow.cpp (revision 0)
+++ Chapter 01/myQtGUIApp/mainwindow.cpp (revision 3)
@@ -0,0 +1,47 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+MainWindow::MainWindow(QWidget *parent)
+ : QMainWindow(parent), ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+}
+
+void MainWindow::on_pushButton_clicked()
+{
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.bmp)"));
+
+ image= cv::imread(fileName.toAscii().data());
+ cv::namedWindow("Original Image");
+ cv::imshow("Original Image", image);
+}
+
+void MainWindow::on_pushButton_2_clicked()
+{
+ cv::flip(image,image,1);
+ cv::namedWindow("Output Image");
+ cv::imshow("Output Image", image);
+}
/Chapter 01/myQtGUIApp/mainwindow.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/myQtGUIApp/myQtGUIApp.pro
===================================================================
--- Chapter 01/myQtGUIApp/myQtGUIApp.pro (revision 0)
+++ Chapter 01/myQtGUIApp/myQtGUIApp.pro (revision 3)
@@ -0,0 +1,25 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2010-06-28T13:41:33
+#
+#-------------------------------------------------
+
+TARGET = myQtGUIApp
+TEMPLATE = app
+
+
+SOURCES += main.cpp\
+ mainwindow.cpp
+
+HEADERS += mainwindow.h
+
+FORMS += mainwindow.ui
+
+INCLUDEPATH += C:\OpenCV2.2\include\
+
+LIBS += -LC:\OpenCV2.2\lib \
+ -lopencv_core220 \
+ -lopencv_highgui220 \
+ -lopencv_imgproc220 \
+ -lopencv_features2d220 \
+ -lopencv_calib3d220
Index: Chapter 01/myQtGUIApp/ui_mainwindow.h
===================================================================
--- Chapter 01/myQtGUIApp/ui_mainwindow.h (revision 0)
+++ Chapter 01/myQtGUIApp/ui_mainwindow.h (revision 3)
@@ -0,0 +1,99 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+/********************************************************************************
+** Form generated from reading UI file 'mainwindow.ui'
+**
+** Created: Tue Jun 29 12:53:36 2010
+** by: Qt User Interface Compiler version 4.6.3
+**
+** WARNING! All changes made in this file will be lost when recompiling UI file!
+********************************************************************************/
+
+#ifndef UI_MAINWINDOW_H
+#define UI_MAINWINDOW_H
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QHeaderView>
+#include <QtGui/QMainWindow>
+#include <QtGui/QMenuBar>
+#include <QtGui/QPushButton>
+#include <QtGui/QStatusBar>
+#include <QtGui/QToolBar>
+#include <QtGui/QWidget>
+
+QT_BEGIN_NAMESPACE
+
+class Ui_MainWindow
+{
+public:
+ QWidget *centralWidget;
+ QPushButton *pushButton;
+ QPushButton *pushButton_2;
+ QMenuBar *menuBar;
+ QToolBar *mainToolBar;
+ QStatusBar *statusBar;
+
+ void setupUi(QMainWindow *MainWindow)
+ {
+ if (MainWindow->objectName().isEmpty())
+ MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
+ MainWindow->resize(262, 214);
+ centralWidget = new QWidget(MainWindow);
+ centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
+ pushButton = new QPushButton(centralWidget);
+ pushButton->setObjectName(QString::fromUtf8("pushButton"));
+ pushButton->setGeometry(QRect(60, 20, 141, 51));
+ pushButton_2 = new QPushButton(centralWidget);
+ pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
+ pushButton_2->setGeometry(QRect(60, 90, 141, 51));
+ MainWindow->setCentralWidget(centralWidget);
+ menuBar = new QMenuBar(MainWindow);
+ menuBar->setObjectName(QString::fromUtf8("menuBar"));
+ menuBar->setGeometry(QRect(0, 0, 262, 25));
+ MainWindow->setMenuBar(menuBar);
+ mainToolBar = new QToolBar(MainWindow);
+ mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
+ MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
+ statusBar = new QStatusBar(MainWindow);
+ statusBar->setObjectName(QString::fromUtf8("statusBar"));
+ MainWindow->setStatusBar(statusBar);
+
+ retranslateUi(MainWindow);
+
+ QMetaObject::connectSlotsByName(MainWindow);
+ } // setupUi
+
+ void retranslateUi(QMainWindow *MainWindow)
+ {
+ MainWindow->setWindowTitle(QApplication::translate("MainWindow", "My Qt Application", 0, QApplication::UnicodeUTF8));
+ pushButton->setText(QApplication::translate("MainWindow", "Open Image", 0, QApplication::UnicodeUTF8));
+ pushButton_2->setText(QApplication::translate("MainWindow", "Process", 0, QApplication::UnicodeUTF8));
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class MainWindow: public Ui_MainWindow {};
+} // namespace Ui
+
+QT_END_NAMESPACE
+
+#endif // UI_MAINWINDOW_H
/Chapter 01/myQtGUIApp/ui_mainwindow.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/myQtGUIApp/Makefile.Debug
===================================================================
--- Chapter 01/myQtGUIApp/Makefile.Debug (revision 0)
+++ Chapter 01/myQtGUIApp/Makefile.Debug (revision 3)
@@ -0,0 +1,176 @@
+#############################################################################
+# Makefile for building: myQtGUIApp
+# Generated by qmake (2.01a) (Qt 4.6.3) on: Mon Feb 28 15:14:16 2011
+# Project: myQtGUIApp.pro
+# Template: app
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cl
+CXX = cl
+DEFINES = -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT
+CFLAGS = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 $(DEFINES)
+CXXFLAGS = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 $(DEFINES)
+INCPATH = -I"..\..\Qt\4.6.3\include\QtCore" -I"..\..\Qt\4.6.3\include\QtGui" -I"..\..\Qt\4.6.3\include" -I"..\..\OpenCV2.2\include" -I"..\..\Qt\4.6.3\include\ActiveQt" -I"debug" -I"." -I"..\..\Qt\4.6.3\mkspecs\win32-msvc2008"
+LINK = link
+LFLAGS = /LIBPATH:"c:\Qt\4.6.3\lib" /NOLOGO /DEBUG /MANIFEST /MANIFESTFILE:"debug\myQtGUIApp.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
+LIBS = c:\Qt\4.6.3\lib\qtmaind.lib /LIBPATH:C:\OpenCV2.2\lib C:\OpenCV2.2\lib\opencv_core220.lib C:\OpenCV2.2\lib\opencv_highgui220.lib C:\OpenCV2.2\lib\opencv_imgproc220.lib C:\OpenCV2.2\lib\opencv_features2d220.lib C:\OpenCV2.2\lib\opencv_calib3d220.lib c:\Qt\4.6.3\lib\QtGuid4.lib c:\Qt\4.6.3\lib\QtCored4.lib
+QMAKE = c:\Qt\4.6.3\bin\qmake.exe
+IDC = c:\Qt\4.6.3\bin\idc.exe
+IDL = midl
+ZIP = zip -r -9
+DEF_FILE =
+RES_FILE =
+COPY = copy /y
+COPY_FILE = $(COPY)
+COPY_DIR = xcopy /s /q /y /i
+DEL_FILE = del
+DEL_DIR = rmdir
+MOVE = move
+CHK_DIR_EXISTS= if not exist
+MKDIR = mkdir
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_PROGRAM = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+
+####### Output directory
+
+OBJECTS_DIR = debug
+
+####### Files
+
+SOURCES = main.cpp \
+ mainwindow.cpp debug\moc_mainwindow.cpp
+OBJECTS = debug\main.obj \
+ debug\mainwindow.obj \
+ debug\moc_mainwindow.obj
+DIST =
+QMAKE_TARGET = myQtGUIApp
+DESTDIR = debug\ #avoid trailing-slash linebreak
+TARGET = myQtGUIApp.exe
+DESTDIR_TARGET = debug\myQtGUIApp.exe
+
+####### Implicit rules
+
+.SUFFIXES: .c .cpp .cc .cxx
+
+{.}.cpp{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{.}.cc{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{.}.cxx{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{.}.c{debug\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.cpp{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.cc{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.cxx{debug\}.obj::
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+{debug}.c{debug\}.obj::
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fodebug\ @<<
+ $<
+<<
+
+####### Build rules
+
+first: all
+all: Makefile.Debug $(DESTDIR_TARGET)
+
+$(DESTDIR_TARGET): ui_mainwindow.h $(OBJECTS)
+ $(LINK) $(LFLAGS) /OUT:$(DESTDIR_TARGET) @<<
+ $(OBJECTS) $(LIBS)
+<<
+ mt.exe -nologo -manifest "debug\myQtGUIApp.intermediate.manifest" -outputresource:$(DESTDIR_TARGET);1
+
+
+
+qmake: FORCE
+ @$(QMAKE) -spec ..\..\Qt\4.6.3\mkspecs\win32-msvc2008 -win32 CONFIG+=release -o Makefile.Debug myQtGUIApp.pro
+
+dist:
+ $(ZIP) myQtGUIApp.zip $(SOURCES) $(DIST) myQtGUIApp.pro ..\..\Qt\4.6.3\mkspecs\qconfig.pri ..\..\Qt\4.6.3\mkspecs\features\qt_functions.prf ..\..\Qt\4.6.3\mkspecs\features\qt_config.prf ..\..\Qt\4.6.3\mkspecs\features\exclusive_builds.prf ..\..\Qt\4.6.3\mkspecs\features\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_pre.prf ..\..\Qt\4.6.3\mkspecs\features\debug.prf ..\..\Qt\4.6.3\mkspecs\features\debug_and_release.prf ..\..\Qt\4.6.3\mkspecs\features\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\win32\default_post.prf ..\..\Qt\4.6.3\mkspecs\features\build_pass.prf ..\..\Qt\4.6.3\mkspecs\features\win32\rtti.prf ..\..\Qt\4.6.3\mkspecs\features\win32\exceptions.prf ..\..\Qt\4.6.3\mkspecs\features\win32\stl.prf ..\..\Qt\4.6.3\mkspecs\features\shared.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_exe.prf ..\..\Qt\4.6.3\mkspecs\features\win32\embed_manifest_dll.prf ..\..\Qt\4.6.3\mkspecs\features\warn_on.prf ..\..\Qt\4.6.3\mkspecs\features\qt.prf ..\..\Qt\4.6.3\mkspecs\features\win32\thread.prf ..\..\Qt\4.6.3\mkspecs\features\moc.prf ..\..\Qt\4.6.3\mkspecs\features\win32\windows.prf ..\..\Qt\4.6.3\mkspecs\features\resources.prf ..\..\Qt\4.6.3\mkspecs\features\uic.prf ..\..\Qt\4.6.3\mkspecs\features\yacc.prf ..\..\Qt\4.6.3\mkspecs\features\lex.prf ..\..\Qt\4.6.3\mkspecs\features\incredibuild_xge.prf ..\..\Qt\4.6.3\mkspecs\features\include_source_dir.prf c:\Qt\4.6.3\lib\qtmaind.prl HEADERS RESOURCES IMAGES SOURCES OBJECTIVE_SOURCES FORMS YACCSOURCES YACCSOURCES LEXSOURCES
+
+clean: compiler_clean
+ -$(DEL_FILE) debug\main.obj debug\mainwindow.obj debug\moc_mainwindow.obj
+ -$(DEL_FILE) debug\myQtGUIApp.intermediate.manifest debug\myQtGUIApp.exp debug\myQtGUIApp.pdb debug\myQtGUIApp.ilk vc*.pdb vc*.idb
+
+distclean: clean
+ -$(DEL_FILE) $(DESTDIR_TARGET)
+ -$(DEL_FILE) Makefile.Debug
+
+check: first
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_moc_header_make_all: debug\moc_mainwindow.cpp
+compiler_moc_header_clean:
+ -$(DEL_FILE) debug\moc_mainwindow.cpp
+debug\moc_mainwindow.cpp: mainwindow.h
+ C:\Qt\4.6.3\bin\moc.exe $(DEFINES) $(INCPATH) -D_MSC_VER=1500 -DWIN32 mainwindow.h -o debug\moc_mainwindow.cpp
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_image_collection_make_all: qmake_image_collection.cpp
+compiler_image_collection_clean:
+ -$(DEL_FILE) qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_uic_make_all: ui_mainwindow.h
+compiler_uic_clean:
+ -$(DEL_FILE) ui_mainwindow.h
+ui_mainwindow.h: mainwindow.ui
+ c:\Qt\4.6.3\bin\uic.exe mainwindow.ui -o ui_mainwindow.h
+
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_header_clean compiler_uic_clean
+
+
+
+####### Compile
+
+debug\main.obj: main.cpp mainwindow.h
+
+debug\mainwindow.obj: mainwindow.cpp mainwindow.h \
+ ui_mainwindow.h
+
+debug\moc_mainwindow.obj: debug\moc_mainwindow.cpp
+
+####### Install
+
+install: FORCE
+
+uninstall: FORCE
+
+FORCE:
+
Index: Chapter 01/myQtGUIApp/mainwindow.h
===================================================================
--- Chapter 01/myQtGUIApp/mainwindow.h (revision 0)
+++ Chapter 01/myQtGUIApp/mainwindow.h (revision 3)
@@ -0,0 +1,50 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QtGui/QMainWindow>
+#include <QFileDialog>
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+
+namespace Ui
+{
+ class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+private:
+ Ui::MainWindow *ui;
+ cv::Mat image; // the image variable
+
+private slots:
+ void on_pushButton_2_clicked();
+ void on_pushButton_clicked();
+};
+
+#endif // MAINWINDOW_H
/Chapter 01/myQtGUIApp/mainwindow.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 01/myQtGUIApp/main.cpp
===================================================================
--- Chapter 01/myQtGUIApp/main.cpp (revision 0)
+++ Chapter 01/myQtGUIApp/main.cpp (revision 3)
@@ -0,0 +1,27 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 1 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <QtGui/QApplication>
+#include "mainwindow.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow w;
+ w.show();
+ return a.exec();
+}
/Chapter 01/myQtGUIApp/main.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 10/BGFGSegmentor.h
===================================================================
--- Chapter 10/BGFGSegmentor.h (revision 0)
+++ Chapter 10/BGFGSegmentor.h (revision 3)
@@ -0,0 +1,76 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 10 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined BGFGSeg
+#define BGFGSeg
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+
+#include "videoprocessor.h"
+
+class BGFGSegmentor : public FrameProcessor {
+
+ cv::Mat gray; // current gray-level image
+ cv::Mat background; // accumulated background
+ cv::Mat backImage; // background image
+ cv::Mat foreground; // foreground image
+ double learningRate; // learning rate in background accumulation
+ int threshold; // threshold for foreground extraction
+
+ public:
+
+ BGFGSegmentor() : threshold(10), learningRate(0.01) {}
+
+ // Set the threshold used to declare a foreground
+ void setThreshold(int t) {
+
+ threshold= t;
+ }
+
+ // Set the learning rate
+ void setLearningRate(double r) {
+
+ learningRate= r;
+ }
+
+ // processing method
+ void process(cv:: Mat &frame, cv:: Mat &output) {
+
+ // convert to gray-level image
+ cv::cvtColor(frame, gray, CV_BGR2GRAY);
+
+ // initialize background to 1st frame
+ if (background.empty())
+ gray.convertTo(background, CV_32F);
+
+ // convert background to 8U
+ background.convertTo(backImage,CV_8U);
+
+ // compute difference between current image and background
+ cv::absdiff(backImage,gray,foreground);
+
+ // apply threshold to foreground image
+ cv::threshold(foreground,output,threshold,255,cv::THRESH_BINARY_INV);
+
+ // accumulate background
+ cv::accumulateWeighted(gray, background, learningRate, output);
+ }
+};
+
+#endif
/Chapter 10/BGFGSegmentor.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 10/tracking.cpp
===================================================================
--- Chapter 10/tracking.cpp (revision 0)
+++ Chapter 10/tracking.cpp (revision 3)
@@ -0,0 +1,159 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 10 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/features2d/features2d.hpp>
+#include <opencv2/video/tracking.hpp>
+
+#include "featuretracker.h"
+
+int main()
+{
+ // Create video procesor instance
+ VideoProcessor processor;
+
+ // Create feature tracker instance
+ FeatureTracker tracker;
+
+ // Open video file
+ processor.setInput("../bike.avi");
+
+ // set frame processor
+ processor.setFrameProcessor(&tracker);
+
+ // Declare a window to display the video
+ processor.displayOutput("Tracked Features");
+
+ // Play the video at the original frame rate
+ processor.setDelay(1000./processor.getFrameRate());
+
+ // Start the process
+ processor.run();
+
+ cv::waitKey();
+ /*
+ // Open the video file
+ cv::VideoCapture capture("../bike.avi");
+ // check if video successfully opened
+ if (!capture.isOpened())
+ return 1;
+
+ // Get the frame rate
+ double rate= capture.get(CV_CAP_PROP_FPS);
+
+ bool stop(false);
+ cv::Mat frame; // current video frame
+ cv::namedWindow("Extracted Frame");
+
+ // Delay between each frame
+ // corresponds to video frame rate
+ int delay= 1000/rate/2;
+
+
+
+ cv::Mat gray,gray_prev;
+ std::vector<cv::Point2f> points[2];
+ std::vector<cv::Point2f> features;
+ const int MAX_COUNT = 500;
+ cv::Size winSize(10,10);
+ cv::TermCriteria termcrit(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03);
+ bool firstframe =true;
+
+
+
+ // for all frames in video
+ while (!stop) {
+
+ // read next frame if any
+ if (!capture.read(frame))
+ break;
+
+
+ cv::cvtColor(frame, gray, CV_BGR2GRAY);
+ if(firstframe)
+ {
+ cv::goodFeaturesToTrack(gray, features, MAX_COUNT, 0.01, 10, cv::Mat(), 3, 0, 0.04);
+ cv::cornerSubPix(gray, features, winSize, cv::Size(-1,-1), termcrit);
+ points[0].insert(points[0].end(),features.begin(),features.end());
+ firstframe=false;
+ }
+
+ {
+ std::vector<uchar> status;
+ std::vector<float> err;
+ if(gray_prev.empty())
+ gray.copyTo(gray_prev);
+ cv::calcOpticalFlowPyrLK(gray_prev, gray, points[0], points[1], status, err, winSize,3, termcrit, 0);
+ size_t i, k;
+ for( i = k = 0; i < points[1].size(); i++ )
+ {
+ if( !status[i] )
+ continue;
+ if ((abs(points[0][i].x-points[1][i].x)+(abs(points[0][i].y-points[1][i].y))<2))
+ continue;
+
+ cv::line( frame, points[0][i],points[1][i], cv::Scalar(0,255,0));
+ points[1][k++] = points[1][i];
+ cv::circle( frame, points[1][i], 3, cv::Scalar(0,255,0), -1, 8);
+ }
+ points[1].resize(k);
+ }
+ if(points[1].size()<=10)
+ firstframe=true;
+ std::swap(points[1], points[0]);
+ cv::swap(gray_prev, gray);
+
+
+ cv::imshow("Extracted Frame",frame);
+
+ // introduce a delay
+ // or press key to stop
+ if (cv::waitKey(delay)>=0)
+ stop= true;
+ }
+
+ // Close the video file
+ capture.release();
+
+ cv::waitKey();
+
+
+ // Create instance
+ VideoProcessor processor;
+ // Open video file
+ processor.setInput("../bike.avi");
+ // Output filename
+// processor.setOutput("../output/bikeOut",".jpg");
+
+ // Declare a window to display the video
+ processor.displayInput("Current Frame");
+ processor.displayOutput("Output Frame");
+
+ // Play the video at the original frame rate
+ processor.setDelay(1000./processor.getFrameRate());
+
+ // Set the frame processor callback function
+ processor.setFrameProcessor(draw);
+
+ // Start the process
+ processor.run();
+
+ cv::waitKey(5000);*/
+}
\ No newline at end of file
/Chapter 10/tracking.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 10/videoprocessing.cpp
===================================================================
--- Chapter 10/videoprocessing.cpp (revision 0)
+++ Chapter 10/videoprocessing.cpp (revision 3)
@@ -0,0 +1,137 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 10 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+#include "videoprocessor.h"
+
+void draw(cv::Mat& img, cv::Mat& out) {
+
+ img.copyTo(out);
+ cv::circle(out, cv::Point(100,100),5,cv::Scalar(255,0,0),2);
+}
+
+void canny(cv::Mat& img, cv::Mat& out) {
+
+ // Convert to gray
+ cv::cvtColor(img,out,CV_BGR2GRAY);
+ // Compute Canny edges
+ cv::Canny(out,out,100,200);
+ // Invert the image
+ cv::threshold(out,out,128,255,cv::THRESH_BINARY_INV);
+}
+
+int main()
+{
+ // Open the video file
+ cv::VideoCapture capture("../bike.avi");
+ // check if video successfully opened
+ if (!capture.isOpened())
+ return 1;
+
+ // Get the frame rate
+ double rate= capture.get(CV_CAP_PROP_FPS);
+
+ bool stop(false);
+ cv::Mat frame; // current video frame
+ cv::namedWindow("Extracted Frame");
+
+ // Delay between each frame
+ // corresponds to video frame rate
+ int delay= 1000/rate;
+
+ // for all frames in video
+ while (!stop) {
+
+ // read next frame if any
+ if (!capture.read(frame))
+ break;
+
+ cv::imshow("Extracted Frame",frame);
+
+ // introduce a delay
+ // or press key to stop
+ if (cv::waitKey(delay)>=0)
+ stop= true;
+ }
+
+ // Close the video file
+ capture.release();
+
+ cv::waitKey();
+
+ // Now using the VideoProcessor class
+
+ // Create instance
+ VideoProcessor processor;
+ // Open video file
+ processor.setInput("../bike.avi");
+ // Declare a window to display the video
+ processor.displayInput("Input Video");
+ processor.displayOutput("Output Video");
+ // Play the video at the original frame rate
+ processor.setDelay(1000./processor.getFrameRate());
+ // Set the frame processor callback function
+ processor.setFrameProcessor(canny);
+ // Start the process
+ processor.run();
+ cv::waitKey();
+
+ // Second test
+ // Create instance
+ // VideoProcessor processor;
+ // Open video file
+ processor.setInput("../bike.avi");
+
+ // Get basic info about video file
+ cv::Size size= processor.getFrameSize();
+ std::cout << size.width << " " << size.height << std::endl;
+ std::cout << processor.getFrameRate() << std::endl;
+ std::cout << processor.getTotalFrameCount() << std::endl;
+ std::cout << processor.getFrameNumber() << std::endl;
+ std::cout << processor.getPositionMS() << std::endl;
+
+ // No processing
+ processor.dontCallProcess();
+ // Output filename
+// processor.setOutput("../output/bikeOut",".jpg");
+ char codec[4];
+ processor.setOutput("../output/bike.avi",processor.getCodec(codec),processor.getFrameRate());
+ std::cout << "Codec: " << codec[0] << codec[1] << codec[2] << codec[3] << std::endl;
+
+ // Position the stream at frame 300
+ // processor.setFrameNumber(300);
+ // processor.stopAtFrameNo(120);
+
+ // Declare a window to display the video
+ processor.displayInput("Current Frame");
+ processor.displayOutput("Output Frame");
+
+ // Play the video at the original frame rate
+ processor.setDelay(1000./processor.getFrameRate());
+
+ // Start the process
+ processor.run();
+
+ std::cout << processor.getFrameNumber() << std::endl;
+ std::cout << processor.getPositionMS() << std::endl;
+
+ cv::waitKey();
+}
\ No newline at end of file
/Chapter 10/videoprocessing.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 10/README.txt
===================================================================
--- Chapter 10/README.txt (revision 0)
+++ Chapter 10/README.txt (revision 3)
@@ -0,0 +1,23 @@
+This directory contains material supporting chapter 10 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+Files:
+ videoprocessing.cpp
+ videoprocessor.h
+correspond to Recipes:
+Reading Video Sequences
+Processing the Video Frames
+Writing Video Sequences
+
+Files:
+ featuretracker.h
+ tracking.cpp
+correspond to Recipe:
+Tracking Feature Points in Video
+
+Files:
+ BGFGSegmentor.h
+ foreground.cpp
+correspond to Recipe:
+Extracting the Foreground Objects in Video
/Chapter 10/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 10/foreground.cpp
===================================================================
--- Chapter 10/foreground.cpp (revision 0)
+++ Chapter 10/foreground.cpp (revision 3)
@@ -0,0 +1,95 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 10 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+#include <opencv2/core/core.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/video/background_segm.hpp>
+
+#include "videoprocessor.h"
+#include "BGFGSegmentor.h"
+
+int main()
+{
+ // Open the video file
+ cv::VideoCapture capture("../bike.avi");
+ // check if video successfully opened
+ if (!capture.isOpened())
+ return 0;
+
+ // current video frame
+ cv::Mat frame;
+ // foreground binary image
+ cv::Mat foreground;
+
+ cv::namedWindow("Extracted Foreground");
+
+ // The Mixture of Gaussian object
+ // used with all default parameters
+ cv::BackgroundSubtractorMOG mog;
+
+ bool stop(false);
+ // for all frames in video
+ while (!stop) {
+
+ // read next frame if any
+ if (!capture.read(frame))
+ break;
+
+ // update the background
+ // and return the foreground
+ mog(frame,foreground,0.01);
+
+ // Complement the image
+ cv::threshold(foreground,foreground,128,255,cv::THRESH_BINARY_INV);
+
+ // show foreground
+ cv::imshow("Extracted Foreground",foreground);
+
+ // introduce a delay
+ // or press key to stop
+ if (cv::waitKey(10)>=0)
+ stop= true;
+ }
+
+ cv::waitKey();
+
+ // Create video procesor instance
+ VideoProcessor processor;
+
+ // Create background/foreground segmentor
+ BGFGSegmentor segmentor;
+ segmentor.setThreshold(25);
+
+ // Open video file
+ processor.setInput("../bike.avi");
+
+ // set frame processor
+ processor.setFrameProcessor(&segmentor);
+
+ // Declare a window to display the video
+ processor.displayOutput("Extracted Foreground");
+
+ // Play the video at the original frame rate
+ processor.setDelay(1000./processor.getFrameRate());
+
+ // Start the process
+ processor.run();
+
+ cv::waitKey();
+}
\ No newline at end of file
/Chapter 10/foreground.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 10/videoprocessor.h
===================================================================
--- Chapter 10/videoprocessor.h (revision 0)
+++ Chapter 10/videoprocessor.h (revision 3)
@@ -0,0 +1,497 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 10 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined VPROCESSOR
+#define VPROCESSOR
+
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+#include <string>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+// The frame processor interface
+class FrameProcessor {
+
+ public:
+ // processing method
+ virtual void process(cv:: Mat &input, cv:: Mat &output)= 0;
+};
+
+class VideoProcessor {
+
+ private:
+
+ // the OpenCV video capture object
+ cv::VideoCapture capture;
+ // the callback function to be called
+ // for the processing of each frame
+ void (*process)(cv::Mat&, cv::Mat&);
+ // the pointer to the class implementing
+ // the FrameProcessor interface
+ FrameProcessor *frameProcessor;
+ // a bool to determine if the
+ // process callback will be called
+ bool callIt;
+ // Input display window name
+ std::string windowNameInput;
+ // Output display window name
+ std::string windowNameOutput;
+ // delay between each frame processing
+ int delay;
+ // number of processed frames
+ long fnumber;
+ // stop at this frame number
+ long frameToStop;
+ // to stop the processing
+ bool stop;
+
+ // vector of image filename to be used as input
+ std::vector<std::string> images;
+ // image vector iterator
+ std::vector<std::string>::const_iterator itImg;
+
+ // the OpenCV video writer object
+ cv::VideoWriter writer;
+ // output filename
+ std::string outputFile;
+
+ // current index for output images
+ int currentIndex;
+ // number of digits in output image filename
+ int digits;
+ // extension of output images
+ std::string extension;
+
+ // to get the next frame
+ // could be: video file; camera; vector of images
+ bool readNextFrame(cv::Mat& frame) {
+
+ if (images.size()==0)
+ return capture.read(frame);
+ else {
+
+ if (itImg != images.end()) {
+
+ frame= cv::imread(*itImg);
+ itImg++;
+ return frame.data != 0;
+ }
+ }
+ }
+
+ // to write the output frame
+ // could be: video file or images
+ void writeNextFrame(cv::Mat& frame) {
+
+ if (extension.length()) { // then we write images
+
+ std::stringstream ss;
+ ss << outputFile << std::setfill('0') << std::setw(digits) << currentIndex++ << extension;
+ cv::imwrite(ss.str(),frame);
+
+ } else { // then write video file
+
+ writer.write(frame);
+ }
+ }
+
+ public:
+
+ // Constructor setting the default values
+ VideoProcessor() : callIt(false), delay(-1),
+ fnumber(0), stop(false), digits(0), frameToStop(-1),
+ process(0), frameProcessor(0) {}
+
+ // set the name of the video file
+ bool setInput(std::string filename) {
+
+ fnumber= 0;
+ // In case a resource was already
+ // associated with the VideoCapture instance
+ capture.release();
+ images.clear();
+
+ // Open the video file
+ return capture.open(filename);
+ }
+
+ // set the camera ID
+ bool setInput(int id) {
+
+ fnumber= 0;
+ // In case a resource was already
+ // associated with the VideoCapture instance
+ capture.release();
+ images.clear();
+
+ // Open the video file
+ return capture.open(id);
+ }
+
+ // set the vector of input images
+ bool setInput(const std::vector<std::string>& imgs) {
+
+ fnumber= 0;
+ // In case a resource was already
+ // associated with the VideoCapture instance
+ capture.release();
+
+ // the input will be this vector of images
+ images= imgs;
+ itImg= images.begin();
+
+ return true;
+ }
+
+ // set the output video file
+ // by default the same parameters than input video will be used
+ bool setOutput(const std::string &filename, int codec=0, double framerate=0.0, bool isColor=true) {
+
+ outputFile= filename;
+ extension.clear();
+
+ if (framerate==0.0)
+ framerate= getFrameRate(); // same as input
+
+ char c[4];
+ // use same codec as input
+ if (codec==0) {
+ codec= getCodec(c);
+ }
+
+ // Open output video
+ return writer.open(outputFile, // filename
+ codec, // codec to be used
+ framerate, // frame rate of the video
+ getFrameSize(), // frame size
+ isColor); // color video?
+ }
+
+ // set the output as a series of image files
+ // extension must be ".jpg", ".bmp" ...
+ bool setOutput(const std::string &filename, // filename prefix
+ const std::string &ext, // image file extension
+ int numberOfDigits=3, // number of digits
+ int startIndex=0) { // start index
+
+ // number of digits must be positive
+ if (numberOfDigits<0)
+ return false;
+
+ // filenames and their common extension
+ outputFile= filename;
+ extension= ext;
+
+ // number of digits in the file numbering scheme
+ digits= numberOfDigits;
+ // start numbering at this index
+ currentIndex= startIndex;
+
+ return true;
+ }
+
+ // set the callback function that will be called for each frame
+ void setFrameProcessor(void (*frameProcessingCallback)(cv::Mat&, cv::Mat&)) {
+
+ // invalidate frame processor class instance
+ frameProcessor= 0;
+ // this is the frame processor function that will be called
+ process= frameProcessingCallback;
+ callProcess();
+ }
+
+ // set the instance of the class that implements the FrameProcessor interface
+ void setFrameProcessor(FrameProcessor* frameProcessorPtr) {
+
+ // invalidate callback function
+ process= 0;
+ // this is the frame processor instance that will be called
+ frameProcessor= frameProcessorPtr;
+ callProcess();
+ }
+
+ // stop streaming at this frame number
+ void stopAtFrameNo(long frame) {
+
+ frameToStop= frame;
+ }
+
+ // process callback to be called
+ void callProcess() {
+
+ callIt= true;
+ }
+
+ // do not call process callback
+ void dontCallProcess() {
+
+ callIt= false;
+ }
+
+ // to display the processed frames
+ void displayInput(std::string wn) {
+
+ windowNameInput= wn;
+ cv::namedWindow(windowNameInput);
+ }
+
+ // to display the processed frames
+ void displayOutput(std::string wn) {
+
+ windowNameOutput= wn;
+ cv::namedWindow(windowNameOutput);
+ }
+
+ // do not display the processed frames
+ void dontDisplay() {
+
+ cv::destroyWindow(windowNameInput);
+ cv::destroyWindow(windowNameOutput);
+ windowNameInput.clear();
+ windowNameOutput.clear();
+ }
+
+ // set a delay between each frame
+ // 0 means wait at each frame
+ // negative means no delay
+ void setDelay(int d) {
+
+ delay= d;
+ }
+
+ // a count is kept of the processed frames
+ long getNumberOfProcessedFrames() {
+
+ return fnumber;
+ }
+
+ // return the size of the video frame
+ cv::Size getFrameSize() {
+
+ if (images.size()==0) {
+
+ // get size of from the capture device
+ int w= static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH));
+ int h= static_cast<int>(capture.get(CV_CAP_PROP_FRAME_HEIGHT));
+
+ return cv::Size(w,h);
+
+ } else { // if input is vector of images
+
+ cv::Mat tmp= cv::imread(images[0]);
+ if (!tmp.data) return cv::Size(0,0);
+ else return tmp.size();
+ }
+ }
+
+ // return the frame number of the next frame
+ long getFrameNumber() {
+
+ if (images.size()==0) {
+
+ // get info of from the capture device
+ long f= static_cast<long>(capture.get(CV_CAP_PROP_POS_FRAMES));
+ return f;
+
+ } else { // if input is vector of images
+
+ return static_cast<long>(itImg-images.begin());
+ }
+ }
+
+ // return the position in ms
+ double getPositionMS() {
+
+ // undefined for vector of images
+ if (images.size()!=0) return 0.0;
+
+ double t= capture.get(CV_CAP_PROP_POS_MSEC);
+ return t;
+ }
+
+ // return the frame rate
+ double getFrameRate() {
+
+ // undefined for vector of images
+ if (images.size()!=0) return 0;
+
+ double r= capture.get(CV_CAP_PROP_FPS);
+ return r;
+ }
+
+ // return the number of frames in video
+ long getTotalFrameCount() {
+
+ // for vector of images
+ if (images.size()!=0) return images.size();
+
+ long t= capture.get(CV_CAP_PROP_FRAME_COUNT);
+ return t;
+ }
+
+ // get the codec of input video
+ int getCodec(char codec[4]) {
+
+ // undefined for vector of images
+ if (images.size()!=0) return -1;
+
+ union {
+ int value;
+ char code[4]; } returned;
+
+ returned.value= static_cast<int>(capture.get(CV_CAP_PROP_FOURCC));
+
+ codec[0]= returned.code[0];
+ codec[1]= returned.code[1];
+ codec[2]= returned.code[2];
+ codec[3]= returned.code[3];
+
+ return returned.value;
+ }
+
+ // go to this frame number
+ bool setFrameNumber(long pos) {
+
+ // for vector of images
+ if (images.size()!=0) {
+
+ // move to position in vector
+ itImg= images.begin() + pos;
+ // is it a valid position?
+ if (pos < images.size())
+ return true;
+ else
+ return false;
+
+ } else { // if input is a capture device
+
+ return capture.set(CV_CAP_PROP_POS_FRAMES, pos);
+ }
+ }
+
+ // go to this position
+ bool setPositionMS(double pos) {
+
+ // not defined in vector of images
+ if (images.size()!=0)
+ return false;
+ else
+ return capture.set(CV_CAP_PROP_POS_MSEC, pos);
+ }
+
+ // go to this position expressed in fraction of total film length
+ bool setRelativePosition(double pos) {
+
+ // for vector of images
+ if (images.size()!=0) {
+
+ // move to position in vector
+ long posI= static_cast<long>(pos*images.size()+0.5);
+ itImg= images.begin() + posI;
+ // is it a valid position?
+ if (posI < images.size())
+ return true;
+ else
+ return false;
+
+ } else { // if input is a capture device
+
+ return capture.set(CV_CAP_PROP_POS_AVI_RATIO, pos);
+ }
+ }
+
+ // Stop the processing
+ void stopIt() {
+
+ stop= true;
+ }
+
+ // Is the process stopped?
+ bool isStopped() {
+
+ return stop;
+ }
+
+ // Is a capture device opened?
+ bool isOpened() {
+
+ return capture.isOpened() || !images.empty();
+ }
+
+ // to grab (and process) the frames of the sequence
+ void run() {
+
+ // current frame
+ cv::Mat frame;
+ // output frame
+ cv::Mat output;
+
+ // if no capture device has been set
+ if (!isOpened())
+ return;
+
+ stop= false;
+
+ while (!isStopped()) {
+
+ // read next frame if any
+ if (!readNextFrame(frame))
+ break;
+
+ // display input frame
+ if (windowNameInput.length()!=0)
+ cv::imshow(windowNameInput,frame);
+
+ // calling the process function or method
+ if (callIt) {
+
+ // process the frame
+ if (process)
+ process(frame, output);
+ else if (frameProcessor)
+ frameProcessor->process(frame,output);
+ // increment frame number
+ fnumber++;
+
+ } else {
+
+ output= frame;
+ }
+
+ // write output sequence
+ if (outputFile.length()!=0)
+ writeNextFrame(output);
+
+ // display output frame
+ if (windowNameOutput.length()!=0)
+ cv::imshow(windowNameOutput,output);
+
+ // introduce a delay
+ if (delay>=0 && cv::waitKey(delay)>=0)
+ stopIt();
+
+ // check if we should stop
+ if (frameToStop>=0 && getFrameNumber()==frameToStop)
+ stopIt();
+ }
+ }
+};
+
+#endif
/Chapter 10/videoprocessor.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 10/featuretracker.h
===================================================================
--- Chapter 10/featuretracker.h (revision 0)
+++ Chapter 10/featuretracker.h (revision 3)
@@ -0,0 +1,141 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 10 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#if !defined FTRACKER
+#define FTRACKER
+
+#include <string>
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/features2d/features2d.hpp>
+#include <opencv2/video/tracking.hpp>
+
+#include "videoprocessor.h"
+
+class FeatureTracker : public FrameProcessor {
+
+ cv::Mat gray; // current gray-level image
+ cv::Mat gray_prev; // previous gray-level image
+ std::vector<cv::Point2f> points[2]; // tracked features from 0->1
+ std::vector<cv::Point2f> initial; // initial position of tracked points
+ std::vector<cv::Point2f> features; // detected features
+ int max_count; // maximum number of features to detect
+ double qlevel; // quality level for feature detection
+ double minDist; // minimum distance between two feature points
+ std::vector<uchar> status; // status of tracked features
+ std::vector<float> err; // error in tracking
+
+ public:
+
+ FeatureTracker() : max_count(500), qlevel(0.01), minDist(10.) {}
+
+ // processing method
+ void process(cv:: Mat &frame, cv:: Mat &output) {
+
+ // convert to gray-level image
+ cv::cvtColor(frame, gray, CV_BGR2GRAY);
+ frame.copyTo(output);
+
+ // 1. if new feature points must be added
+ if(addNewPoints())
+ {
+ // detect feature points
+ detectFeaturePoints();
+ // add the detected features to the currently tracked features
+ points[0].insert(points[0].end(),features.begin(),features.end());
+ initial.insert(initial.end(),features.begin(),features.end());
+ }
+
+ // for first image of the sequence
+ if(gray_prev.empty())
+ gray.copyTo(gray_prev);
+
+ // 2. track features
+ cv::calcOpticalFlowPyrLK(gray_prev, gray, // 2 consecutive images
+ points[0], // input point position in first image
+ points[1], // output point postion in the second image
+ status, // tracking success
+ err); // tracking error
+
+ // 2. loop over the tracked points to reject the undesirables
+ int k=0;
+ for( int i= 0; i < points[1].size(); i++ ) {
+
+ // do we keep this point?
+ if (acceptTrackedPoint(i)) {
+
+ // keep this point in vector
+ initial[k]= initial[i];
+ points[1][k++] = points[1][i];
+ }
+ }
+
+ // eliminate unsuccesful points
+ points[1].resize(k);
+ initial.resize(k);
+
+ // 3. handle the accepted tracked points
+ handleTrackedPoints(frame, output);
+
+ // 4. current points and image become previous ones
+ std::swap(points[1], points[0]);
+ cv::swap(gray_prev, gray);
+ }
+
+ // feature point detection
+ void detectFeaturePoints() {
+
+ // detect the features
+ cv::goodFeaturesToTrack(gray, // the image
+ features, // the output detected features
+ max_count, // the maximum number of features
+ qlevel, // quality level
+ minDist); // min distance between two features
+ }
+
+ // determine if new points should be added
+ bool addNewPoints() {
+
+ // if too few points
+ return points[0].size()<=10;
+ }
+
+ // determine which tracked point should be accepted
+ bool acceptTrackedPoint(int i) {
+
+ return status[i] &&
+ // if point has moved
+ (abs(points[0][i].x-points[1][i].x)+
+ (abs(points[0][i].y-points[1][i].y))>2);
+ }
+
+ // handle the currently tracked points
+ void handleTrackedPoints(cv:: Mat &frame, cv:: Mat &output) {
+
+ // for all tracked points
+ for(int i= 0; i < points[1].size(); i++ ) {
+
+ // draw line and circle
+ cv::line(output, initial[i], points[1][i], cv::Scalar(255,255,255));
+ cv::circle(output, points[1][i], 3, cv::Scalar(255,255,255),-1);
+ }
+ }
+};
+
+#endif
/Chapter 10/featuretracker.h
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 02/README.txt
===================================================================
--- Chapter 02/README.txt (revision 0)
+++ Chapter 02/README.txt (revision 3)
@@ -0,0 +1,26 @@
+This directory contains material supporting chapter 2 of the cookbook:
+Computer Vision Programming using the OpenCV Library.
+by Robert Laganiere, Packt Publishing, 2011.
+
+File:
+ saltImage.cpp
+correspond to Recipe:
+Accessing the pixel values
+
+File:
+ colorReduce.cpp
+correspond to Recipes:
+Scanning an image with pointers
+Scanning an image with iterators
+Writing efficient image scanning loops
+
+File:
+ contrast.cpp
+correspond to Recipe:
+Scanning an image with neighbour access
+
+File:
+ addImages.cpp
+correspond to Recipes:
+Performing simple image arithmetic
+Defining regions of interest
/Chapter 02/README.txt
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 02/contrast.cpp
===================================================================
--- Chapter 02/contrast.cpp (revision 0)
+++ Chapter 02/contrast.cpp (revision 3)
@@ -0,0 +1,151 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 2 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <opencv2/imgproc/imgproc.hpp>
+
+
+void sharpen(const cv::Mat &image, cv::Mat &result) {
+
+ result.create(image.size(), image.type()); // allocate if necessary
+
+ for (int j= 1; j<image.rows-1; j++) { // for all rows (except first and last)
+
+ const uchar* previous= image.ptr<const uchar>(j-1); // previous row
+ const uchar* current= image.ptr<const uchar>(j); // current row
+ const uchar* next= image.ptr<const uchar>(j+1); // next row
+
+ uchar* output= result.ptr<uchar>(j); // output row
+
+ for (int i=1; i<image.cols-1; i++) {
+
+ *output++= cv::saturate_cast<uchar>(5*current[i]-current[i-1]-current[i+1]-previous[i]-next[i]);
+// output[i]= cv::saturate_cast<uchar>(5*current[i]-current[i-1]-current[i+1]-previous[i]-next[i]);
+ }
+ }
+
+ // Set the unprocess pixels to 0
+ result.row(0).setTo(cv::Scalar(0));
+ result.row(result.rows-1).setTo(cv::Scalar(0));
+ result.col(0).setTo(cv::Scalar(0));
+ result.col(result.cols-1).setTo(cv::Scalar(0));
+}
+
+void sharpen2(const cv::Mat &image, cv::Mat &result) {
+
+ result.create(image.size(), image.type()); // allocate if necessary
+
+ int step= image.step1();
+ const uchar* previous= image.data; // ptr to previous row
+ const uchar* current= image.data+step; // ptr to current row
+ const uchar* next= image.data+2*step; // ptr to next row
+ uchar *output= result.data+step; // ptr to output row
+
+ for (int j= 1; j<image.rows-1; j++) { // for each row (except first and last)
+ for (int i=1; i<image.cols-1; i++) { // for each column (except first and last)
+
+ output[i]= cv::saturate_cast<uchar>(5*current[i]-current[i-1]-current[i+1]-previous[i]-next[i]);
+ }
+
+ previous+= step;
+ current+= step;
+ next+= step;
+ output+= step;
+ }
+
+ // Set the unprocess pixels to 0
+ result.row(0).setTo(cv::Scalar(0));
+ result.row(result.rows-1).setTo(cv::Scalar(0));
+ result.col(0).setTo(cv::Scalar(0));
+ result.col(result.cols-1).setTo(cv::Scalar(0));
+}
+
+void sharpen3(const cv::Mat &image, cv::Mat &result) {
+
+ cv::Mat_<uchar>::const_iterator it= image.begin<uchar>()+image.step;
+ cv::Mat_<uchar>::const_iterator itend= image.end<uchar>()-image.step;
+ cv::Mat_<uchar>::const_iterator itup= image.begin<uchar>();
+ cv::Mat_<uchar>::const_iterator itdown= image.begin<uchar>()+2*image.step;
+
+ result.create(image.size(), image.type()); // allocate if necessary
+ cv::Mat_<uchar>::iterator itout= result.begin<uchar>()+result.step;
+
+ for ( ; it!= itend; ++it, ++itup, ++itdown) {
+
+ *itout= cv::saturate_cast<uchar>(*it *5 - *(it-1)- *(it+1)- *itup - *itdown);
+ }
+}
+
+void sharpen2D(const cv::Mat &image, cv::Mat &result) {
+
+ // Construct kernel (all entries initialized to 0)
+ cv::Mat kernel(3,3,CV_32F,cv::Scalar(0));
+ // assigns kernel values
+ kernel.at<float>(1,1)= 5.0;
+ kernel.at<float>(0,1)= -1.0;
+ kernel.at<float>(2,1)= -1.0;
+ kernel.at<float>(1,0)= -1.0;
+ kernel.at<float>(1,2)= -1.0;
+
+ //filter the image
+ cv::filter2D(image,result,image.depth(),kernel);
+}
+
+int main()
+{
+ cv::Mat image= cv::imread("boldt.jpg",0);
+ if (!image.data)
+ return 0;
+
+ cv::Mat result;
+ result.create(image.size(),image.type());
+
+ double time= static_cast<double>(cv::getTickCount());
+ sharpen(image, result);
+ time= (static_cast<double>(cv::getTickCount())-time)/cv::getTickFrequency();
+ std::cout << "time= " << time << std::endl;
+
+ cv::namedWindow("Image");
+ cv::imshow("Image",result);
+
+ image= cv::imread("boldt.jpg",0);
+ time= static_cast<double>(cv::getTickCount());
+ sharpen3(image, result);
+ time= (static_cast<double>(cv::getTickCount())-time)/cv::getTickFrequency();
+ std::cout << "time 3= " << time << std::endl;
+
+ cv::namedWindow("Image 3");
+ cv::imshow("Image 3",result);
+
+ image= cv::imread("boldt.jpg",0);
+ time= static_cast<double>(cv::getTickCount());
+ sharpen2D(image, result);
+ time= (static_cast<double>(cv::getTickCount())-time)/cv::getTickFrequency();
+ std::cout << "time 2D= " << time << std::endl;
+
+ cv::namedWindow("Image 2D");
+ cv::imshow("Image 2D",result);
+
+ cv::waitKey();
+
+ return 0;
+}
+
+
/Chapter 02/contrast.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 02/addImages.cpp
===================================================================
--- Chapter 02/addImages.cpp (revision 0)
+++ Chapter 02/addImages.cpp (revision 3)
@@ -0,0 +1,120 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 2 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+
+#include <vector>
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+
+int main()
+{
+ cv::Mat image1;
+ cv::Mat image2;
+
+ image1= cv::imread("boldt.jpg");
+ image2= cv::imread("rain.jpg");
+ if (!image1.data)
+ return 0;
+ if (!image2.data)
+ return 0;
+
+ cv::namedWindow("Image 1");
+ cv::imshow("Image 1",image1);
+ cv::namedWindow("Image 2");
+ cv::imshow("Image 2",image2);
+
+ cv::Mat result;
+ cv::addWeighted(image1,0.7,image2,0.9,0.,result);
+
+ cv::namedWindow("result");
+ cv::imshow("result",result);
+
+ // using overloaded operator
+ result= 0.7*image1+0.9*image2;
+
+ cv::namedWindow("result with operators");
+ cv::imshow("result with operators",result);
+
+ image2= cv::imread("rain.jpg",0);
+
+ // create vector of 3 images
+ std::vector<cv::Mat> planes;
+ // split 1 3-channel image into 3 1-channel images
+ cv::split(image1,planes);
+ // add to blue channel
+ planes[0]+= image2;
+ // merge the 3 1-channel images into 1 3-channel image
+ cv::merge(planes,result);
+
+ cv::namedWindow("Result on blue channel");
+ cv::imshow("Result on blue channel",result);
+
+ // read images
+ cv::Mat image= cv::imread("boldt.jpg");
+ cv::Mat logo= cv::imread("logo.bmp");
+
+ // define image ROI
+ cv::Mat imageROI;
+ imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));
+
+ // add logo to image
+ cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);
+
+ // show result
+ cv::namedWindow("with logo");
+ cv::imshow("with logo",image);
+
+ // read images
+ image= cv::imread("boldt.jpg");
+ logo= cv::imread("logo.bmp");
+
+ // define ROI
+ imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));
+
+ // load the mask (must be gray-level)
+ cv::Mat mask= cv::imread("logo.bmp",0);
+
+ // copy to ROI with mask
+ logo.copyTo(imageROI,mask);
+
+ // show result
+ cv::namedWindow("with logo 2");
+ cv::imshow("with logo 2",image);
+
+ // read images
+ logo= cv::imread("logo.bmp",0);
+ image1= cv::imread("boldt.jpg");
+
+ // split 3-channel image into 3 1-channel images
+ std::vector<cv::Mat> channels;
+ cv::split(image1,channels);
+
+ imageROI= channels.at(1);
+
+ cv::addWeighted(imageROI(cv::Rect(385,270,logo.cols,logo.rows)),1.0,
+ logo,0.5,0.,imageROI(cv::Rect(385,270,logo.cols,logo.rows)));
+
+ cv::merge(channels,image1);
+
+ cv::namedWindow("with logo 3");
+ cv::imshow("with logo 3",image1);
+
+ cv::waitKey();
+
+ return 0;
+}
/Chapter 02/addImages.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 02/colorReduce.cpp
===================================================================
--- Chapter 02/colorReduce.cpp (revision 0)
+++ Chapter 02/colorReduce.cpp (revision 3)
@@ -0,0 +1,507 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 2 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <iostream>
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+// using .ptr and []
+void colorReduce0(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols * image.channels(); // total number of elements per line
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= image.ptr<uchar>(j);
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ data[i]= data[i]/div*div + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+// using .ptr and * ++
+void colorReduce1(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols * image.channels(); // total number of elements per line
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= image.ptr<uchar>(j);
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ *data++= *data/div*div + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+// using .ptr and * ++ and modulo
+void colorReduce2(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols * image.channels(); // total number of elements per line
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= image.ptr<uchar>(j);
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ int v= *data;
+ *data++= v - v%div + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+// using .ptr and * ++ and bitwise
+void colorReduce3(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols * image.channels(); // total number of elements per line
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= image.ptr<uchar>(j);
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ *data++= *data&mask + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+
+// direct pointer arithmetic
+void colorReduce4(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols * image.channels(); // total number of elements per line
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ int step= image.step; // effective width
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ // get the pointer to the image buffer
+ uchar *data= image.data;
+
+ for (int j=0; j<nl; j++) {
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ *(data+i)= *data&mask + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+
+ data+= step; // next line
+ }
+}
+
+// using .ptr and * ++ and bitwise with image.cols * image.channels()
+void colorReduce5(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= image.ptr<uchar>(j);
+
+ for (int i=0; i<image.cols * image.channels(); i++) {
+
+ // process each pixel ---------------------
+
+ *data++= *data&mask + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+// using .ptr and * ++ and bitwise (continuous)
+void colorReduce6(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols * image.channels(); // total number of elements per line
+
+ if (image.isContinuous()) {
+ // then no padded pixels
+ nc= nc*nl;
+ nl= 1; // it is now a 1D array
+ }
+
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= image.ptr<uchar>(j);
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ *data++= *data&mask + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+// using .ptr and * ++ and bitwise (continuous+channels)
+void colorReduce7(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols ; // number of columns
+
+ if (image.isContinuous()) {
+ // then no padded pixels
+ nc= nc*nl;
+ nl= 1; // it is now a 1D array
+ }
+
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= image.ptr<uchar>(j);
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ *data++= *data&mask + div/2;
+ *data++= *data&mask + div/2;
+ *data++= *data&mask + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+
+// using Mat_ iterator
+void colorReduce8(cv::Mat &image, int div=64) {
+
+ // get iterators
+ cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();
+ cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();
+
+ for ( ; it!= itend; ++it) {
+
+ // process each pixel ---------------------
+
+ (*it)[0]= (*it)[0]/div*div + div/2;
+ (*it)[1]= (*it)[1]/div*div + div/2;
+ (*it)[2]= (*it)[2]/div*div + div/2;
+
+ // end of pixel processing ----------------
+ }
+}
+
+// using Mat_ iterator and bitwise
+void colorReduce9(cv::Mat &image, int div=64) {
+
+ // div must be a power of 2
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ // get iterators
+ cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();
+ cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();
+
+ // scan all pixels
+ for ( ; it!= itend; ++it) {
+
+ // process each pixel ---------------------
+
+ (*it)[0]= (*it)[0]&mask + div/2;
+ (*it)[1]= (*it)[1]&mask + div/2;
+ (*it)[2]= (*it)[2]&mask + div/2;
+
+ // end of pixel processing ----------------
+ }
+}
+
+// using MatIterator_
+void colorReduce10(cv::Mat &image, int div=64) {
+
+ // get iterators
+ cv::Mat_<cv::Vec3b> cimage= image;
+ cv::Mat_<cv::Vec3b>::iterator it=cimage.begin();
+ cv::Mat_<cv::Vec3b>::iterator itend=cimage.end();
+
+ for ( ; it!= itend; it++) {
+
+ // process each pixel ---------------------
+
+ (*it)[0]= (*it)[0]/div*div + div/2;
+ (*it)[1]= (*it)[1]/div*div + div/2;
+ (*it)[2]= (*it)[2]/div*div + div/2;
+
+ // end of pixel processing ----------------
+ }
+}
+
+
+void colorReduce11(cv::Mat &image, int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols; // number of columns
+
+ for (int j=0; j<nl; j++) {
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ image.at<cv::Vec3b>(j,i)[0]= image.at<cv::Vec3b>(j,i)[0]/div*div + div/2;
+ image.at<cv::Vec3b>(j,i)[1]= image.at<cv::Vec3b>(j,i)[1]/div*div + div/2;
+ image.at<cv::Vec3b>(j,i)[2]= image.at<cv::Vec3b>(j,i)[2]/div*div + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+// with input/ouput images
+void colorReduce12(const cv::Mat &image, // input image
+ cv::Mat &result, // output image
+ int div=64) {
+
+ int nl= image.rows; // number of lines
+ int nc= image.cols ; // number of columns
+
+ // allocate output image if necessary
+ result.create(image.rows,image.cols,image.type());
+
+ // created images have no padded pixels
+ nc= nc*nl;
+ nl= 1; // it is now a 1D array
+
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ for (int j=0; j<nl; j++) {
+
+ uchar* data= result.ptr<uchar>(j);
+ const uchar* idata= image.ptr<uchar>(j);
+
+ for (int i=0; i<nc; i++) {
+
+ // process each pixel ---------------------
+
+ *data++= (*idata++)&mask + div/2;
+ *data++= (*idata++)&mask + div/2;
+ *data++= (*idata++)&mask + div/2;
+
+ // end of pixel processing ----------------
+
+ } // end of line
+ }
+}
+
+// using overloaded operators
+void colorReduce13(cv::Mat &image, int div=64) {
+
+ int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
+ // mask used to round the pixel value
+ uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
+
+ // perform color reduction
+ image=(image&cv::Scalar(mask,mask,mask))+cv::Scalar(div/2,div/2,div/2);
+}
+
+
+#define NTESTS 14
+#define NITERATIONS 20
+
+int main()
+{
+ int64 t[NTESTS],tinit;
+ cv::Mat image1;
+ cv::Mat image2;
+
+ // timer values set to 0
+ for (int i=0; i<NTESTS; i++)
+ t[i]= 0;
+
+ // repeat the tests several times
+ int n=NITERATIONS;
+ for (int k=0; k<n; k++) {
+
+ std::cout << k << " of " << n << std::endl;
+
+ image1= cv::imread("../image.jpg");
+ if (!image1.data)
+ return 0;
+
+ // using .ptr and []
+ tinit= cv::getTickCount();
+ colorReduce0(image1);
+ t[0]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using .ptr and * ++
+ tinit= cv::getTickCount();
+ colorReduce1(image1);
+ t[1]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using .ptr and * ++ and modulo
+ tinit= cv::getTickCount();
+ colorReduce2(image1);
+ t[2]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using .ptr and * ++ and bitwise
+ tinit= cv::getTickCount();
+ colorReduce3(image1);
+ t[3]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using direct pointer arithmetic
+ tinit= cv::getTickCount();
+ colorReduce4(image1);
+ t[4]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using .ptr and * ++ and bitwise with image.cols * image.channels()
+ tinit= cv::getTickCount();
+ colorReduce5(image1);
+ t[5]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using .ptr and * ++ and bitwise (continuous)
+ tinit= cv::getTickCount();
+ colorReduce6(image1);
+ t[6]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using .ptr and * ++ and bitwise (continuous+channels)
+ tinit= cv::getTickCount();
+ colorReduce7(image1);
+ t[7]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using Mat_ iterator
+ tinit= cv::getTickCount();
+ colorReduce8(image1);
+ t[8]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using Mat_ iterator and bitwise
+ tinit= cv::getTickCount();
+ colorReduce9(image1);
+ t[9]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using Mat_ iterator
+ tinit= cv::getTickCount();
+ colorReduce10(image1);
+ t[10]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using at
+ tinit= cv::getTickCount();
+ colorReduce11(image1);
+ t[11]+= cv::getTickCount()-tinit;
+
+ image1= cv::imread("../image.jpg");
+ // using input/output images
+ tinit= cv::getTickCount();
+ cv::Mat result;
+ colorReduce12(image1, result);
+ t[12]+= cv::getTickCount()-tinit;
+
+ image2= result;
+
+ image1= cv::imread("../image.jpg");
+ // using input/output images
+ tinit= cv::getTickCount();
+ colorReduce13(image1);
+ t[13]+= cv::getTickCount()-tinit;
+
+ //------------------------------
+ }
+
+ cv::namedWindow("Result");
+ cv::imshow("Result",image2);
+ cv::namedWindow("Image Result");
+ cv::imshow("Image Result",image1);
+
+ // print average execution time
+ std::cout << std::endl << "-------------------------------------------" << std::endl << std::endl;
+ std::cout << "using .ptr and [] =" << 1000.*t[0]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using .ptr and * ++ =" << 1000.*t[1]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using .ptr and * ++ and modulo =" << 1000.*t[2]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using .ptr and * ++ and bitwise =" << 1000.*t[3]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using direct pointer arithmetic =" << 1000.*t[4]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using .ptr and * ++ and bitwise with image.cols * image.channels() =" << 1000.*t[5]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using .ptr and * ++ and bitwise (continuous) =" << 1000.*t[6]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using .ptr and * ++ and bitwise (continuous+channels) =" << 1000.*t[7]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using Mat_ iterator =" << 1000.*t[8]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using Mat_ iterator and bitwise =" << 1000.*t[9]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using MatIterator_ =" << 1000.*t[10]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using at =" << 1000.*t[11]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using input/output images =" << 1000.*t[12]/cv::getTickFrequency()/n << "ms" << std::endl;
+ std::cout << "using overloaded operators =" << 1000.*t[13]/cv::getTickFrequency()/n << "ms" << std::endl;
+
+ cv::waitKey();
+ return 0;
+}
/Chapter 02/colorReduce.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: Chapter 02/saltImage.cpp
===================================================================
--- Chapter 02/saltImage.cpp (revision 0)
+++ Chapter 02/saltImage.cpp (revision 3)
@@ -0,0 +1,62 @@
+/*------------------------------------------------------------------------------------------*\
+ This file contains material supporting chapter 2 of the cookbook:
+ Computer Vision Programming using the OpenCV Library.
+ by Robert Laganiere, Packt Publishing, 2011.
+
+ This program is free software; permission is hereby granted to use, copy, modify,
+ and distribute this source code, or portions thereof, for any purpose, without fee,
+ subject to the restriction that the copyright notice may not be removed
+ or altered from any source or altered source distribution.
+ The software is released on an as-is basis and without any warranties of any kind.
+ In particular, the software is not guaranteed to be fault-tolerant or free from failure.
+ The author disclaims all warranties with regard to this software, any use,
+ and any consequent failure, is purely the responsibility of the user.
+
+ Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name
+\*------------------------------------------------------------------------------------------*/
+
+#include <opencv2/core/core.hpp>
+#include <opencv2/highgui/highgui.hpp>
+
+void salt(cv::Mat &image, int n) {
+
+ int i,j;
+ for (int k=0; k<n; k++) {
+
+ // rand() is the MFC random number generator
+ i= rand()%image.cols;
+ j= rand()%image.rows;
+
+
+ if (image.channels() == 1) { // gray-level image
+
+ image.at<uchar>(j,i)= 255;
+
+ } else if (image.channels() == 3) { // color image
+
+ image.at<cv::Vec3b>(j,i)[0]= 255;
+ image.at<cv::Vec3b>(j,i)[1]= 255;
+ image.at<cv::Vec3b>(j,i)[2]= 255;
+ }
+ }
+}
+
+int main()
+{
+ srand(cv::getTickCount()); // init random number generator
+
+ cv::Mat image= cv::imread("boldt.jpg",0);
+
+ salt(image,3000);
+
+ cv::namedWindow("Image");
+ cv::imshow("Image",image);
+
+ cv::imwrite("salted.bmp",image);
+
+ cv::waitKey(5000);
+
+ return 0;
+}
+
+
/Chapter 02/saltImage.cpp
Property changes:
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property