webee.technion.ac.il · web viewמאחר ורוב פיתוחי האלגוריתמים נעשים...

58
; טטט טטטטטט: יייייי ייייייייי טטטטט: טטטטMATLAB-OpenCV טטטטטט טטטטטטט טט טטטטט טטטטט טטטטטט: יייי ייייי יייי ייי טטטט:1 טטטט טטטטטטטט- טטטטטטט טטטטטטTECHNION - ISRAEL INSTITUTE OF TECHNOLOGY טטטטטטט טטטטטט טטטט

Upload: others

Post on 19-Apr-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

פרויקט סמסטריאלי דוח פרויקט :

הנושא:

לשיפורMATLAB-OpenCVממשק ביצועים של עוקבי וידאו

מגישים:

רביע עראבה רביע שלש

מנחה:

אריה נחמני

חורף תשע"גסמסטר:1

הטכניון - מכון טכנולוגי לישראל TECHNION - ISRAEL INSTITUTE OF TECHNOLOGY

הפקולטה להנדסת חשמלהמעבדה לבקרה רובוטיקה ולמידה חישובית

Page 2: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

:תודות

מנחה הפרויקט: מר אריה נחמני

:צוות המעבדה לבקרה ורובוטיקה

מר קובי כוחייגב' אורלי ויגדרזון

2

Page 3: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

תוכן העניינים1

4-5....................................................................................רשימת איורים.

6.............................................................................................. תקציר.2

3 . abstract.....................................................................................................................7

4. מבו

……..................................................................................................................א….……8

.תאור5כללי.................................................................................................................

.....9-34

ודוגמאותopencv- מדריך להתקנת 5.1 10-26לשימוש ..........................................................................

5.2- matlab coder ........................................................... .......................................................27-35

- ניסיון5.2.1 29-33ראשון ...............................................................................................................

- תוצאות5.2.2 34-35התרגום .........................................................................................................

visual studio .........................................................................................................36-40- מעבר ל 5.3

3

Page 4: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

6. ............................................................................................................... תוצאות

.......41-4344.סיכום ומסקנות................................................................................................................7

45.ביבלוגרפיה ...................................................................................................................8

רשימת איורים

- תזרים1איור מס' 7עבודה..........................................................................................

cmake- source code.............................................................................11 –2איור מס'

cmake- binaries destination................................................................11- 3איור מס'

cmake- chosen generator....................................................................12-4איור מס'

opencv.sln..............................................................................13- הפעלת ה 5איור מס'

path............................................................................14 ל opencv- הוספת 6איור מס

4

Page 5: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

vs ....................................................................................15- פרוייקט חדש ב7איור מס'

–המשך.........................................................................vs- פרוייקט חדש ב8איור מס 15

include directories................................................................................16- 9איור מס

library directories & source directories............................................17- 10איור מס'

Additional dependencies...................................................................17 - 11איור מס'

- תוצאת ההרצה של הדוגמא....................................................................12איור מס' 18

כספרייה נוספת.........................................................cvblobs –הוספת ה 13איור מס'19

runtime library...................................................................................20- 14איור מס'

cv Blob................................................................24- תוצאת הרצה לדוגמא 15איור מס'

- הכלה שגוררת שגיאות...........................................................................16איור מס' 25

-דוגמא17איור מס' 26במטלב.........................................................................................

- הגדרת18איור מס'27המהדר........................................................................................

matlab’s m-Lint...................................................................................28- 19איור מס'

cconv...........................................................................29- עריכת פונקציית 20איור מס'

preallocate..............................................................................31- דוגמא ל 21איור מס'

coder......................................................................................31- הפעלת ה 22איור מס'

- תמיכה\אי תמיכה במספרים אינסופיים .....................................................23איור מס 32

advanced settings...............................................................................33 – 24איור מס'

34- שגיאה בתרגום- מחיקת אלמנטים לא נתמכת.........................................25איור מס'

35- שגיאת תרגום- מימדים לא תואמים......................................................26איור מס'

5

Page 6: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

precompiled header.........................................................................36- 27איור מס'

- קריאת ווידאו.......................................................................................28איור מס 37

37 מימוש.........................................................................mousehandler- 29איור מס

- קבלת ערכי30איור מס' 38הפקסלים............................................................................

BW.................................................................................38- העברת ערכי ה 31איור מס

- חישוב מרכז מסה ואוריינטציה...............................................................32איור מס' 39

- קבלת פרימים33איור מס 39ברצף................................................................................

hull..............................................................................................40- ייצור 34איור מס

coder.......................................................................41- הגדרת פרמטרים ב 35איור מס'

6

Page 7: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

תקציר

, ורוב המימושים בעולם האמיתי נעשים בMATLABמאחר ורוב פיתוחי האלגוריתמים נעשים ב-C אנו רוצים מעבר הכי קל ומהיר מקוד מטלב לקוד ++C שניתן לקמפל ב ++visual studio

++ הסטנדרטי אין כלים פשוטים לפתרון בעיות בראיה ממוחשבת )או באלגברה וכו'(,Cב בכדי לחסוךopencvלכן נדרש להשתמש בספריה )או ספריות( כלשהי –במקרה שלנו ספריית -

בעבודה ולא לכתוב את הכל מהתחלה.

יכולהmatlab הרי שורה אחת ב matlabתרגום כזה נחוץ מכיוון שיותר פשוט לכתוב קוד ב ++ ומצד שני המטלב נחשב לבזבזני בניצול במשאבי הזיכרון שלCלהתאים למאות שורות של

המערכת לעומת קוד מונחה עצמים.

++ C לקוד MATLABבפרויקט זה, מוצעת מסגרת למעבר הקל ביותר מקוד ב-

7

Page 8: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

Abstract

Since most of algorithms development done with Matlab and most of the implementations in the real world done with C++, we will provide method which convert from Matlab to C++ as automatic as possible which can be compiled in visual studio.

In standard C++ there is no simple tools to solve computer vision problems, so we need to use library (or libraries ) in our case opencv, to save time.

Such conversion is needed because it’s much easier to write code in Matlab than writing it in C++, one line in Matlab may equal hundreds linnes in C++, on the other hand Matlab is wasteful in terms of storage and memory resources.

work flow- 1איור מס'

8

Page 9: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

מבוא

:הצגת הבעיה

שכתיבת קוד בו MATLABרוב פיתוחי האלגוריתמים העוסקים בראייה ממוחשבת נעשים -נחשבת לפשוטה מאוד ביחס לשפות אחרות

++ -שכתיבת קוד בה נחשבתCרוב המימושים בעולם האמיתי נעשים ב הבעייה היא ש , מכאן יש את הצורך למצוא מעבר הכי קל ומהיר מקודMATLABלמסובכת מאוד ביחס ל

.visual studio++ אותו ניתן לקמפל ב Cמטלב לקוד

מטרת הפרוייקט:

++ ,הכליC לקוד MATLABבפרוייקט זה מוצעת מסגרת למעבר הקל ביותר מקוד ב- matlab coderהוא ה ++ C לקוד ב Matlabהעיקרי במעבר זה ושדרכו עושים את התרגום מקוד ב

ונקבל תוצאותopencv++ נשלב פונקציות מספריית ה C,ועל מנת לספק תרגום יעיל ל בopencvזהות בין ריצת הקוד המקורי במטלב לבין ריצת הקוד המתורגם בתוספת ספריית ה

visual studio

9

Page 10: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

תיאור כללי

ואת כל סביבת העבודה הדרושהSimple itkבחלק הראשון של הפרויקט נסינו להתקין את Visual studio ,cmake,Cygwin,svn,slicer3לביצוע זאת כגון

מה שדרש הרבה זמן ושטח בזיכרון וטיפול בכל מיני שגיאות מוזרות וניסיונות )כגון חיפושספריות ( רבים לנסות איכשהו להתקין אותה.

דרךmake ובניית קבצי ה simple-itk של superbuildכאשר בהתחלה ניסינו לעשות זאת דרך ה אבל ללא הצלחה מסיבות שלא מצליחים לזהות את הספריות הדרושות למרותcmakeה

שנמצאו ספריות אלו.

שהוא גם הכיל בתוכו ספריותslicer3 של ה superbuildאחר מכן ניסינו להתקין אותה דרך ה linux בתוך סביבת עבודה שמדמה מערכת הפעלה של simple itkה

.וגם שם זה לא עבד .Svn ו ה Cygwin דרך ה windos7על

.windows שהוא כלי שבטוח אפשר להתקין ב opencvמכאן החלטנו לעבור לעבודה בסביבת

עם כל השלבים החיונייםvisual studio 2010 ב opencvבדף הבא מציגים איך להתקין את ה להתקנה תקינה

10

Page 11: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

ולשימוש בה opencv מדריך להתקנת ה

המדריך מבוסס על:

1- http://opencv.willowgarage.com/wiki/VisualC%2B%2B_VS2010

הקדמה

Opencv   Open Source Computer Visionהמיועדת למתכנתים שנועדה לעזור לפתחתוכנה  ( (היא חבילת ראייה ממוחשבת . יישומים של

.windows 7 proffesional עם opencvבמדרי, זה נסביר צעד אחרי צעד איך להתקין תוכנות דרושות:

Microsoft Visual Studio 2010 Professional

Cmake 2.8.6 (http://www.cmake.org/cmake/resources/software.html)

.OpenCV 2.1.0 (http://opencv.willowgarage.com/wiki/)

יעזור לך(12 )צעד system Path לcmake יש להוסיף את ה Cmake 2.8.6אחרי התקנת ה

:open cv כעת יש לעבור על הצעדים הבאים אחד אחרי השני כדי להתקין את ה

( במקום מתאים. אצלנו extract, יש לחלץ את הקובץ) opencv 2.1.0 zip-אחרי הורדת ה 1

C:\opencv.

.cmake 2.8.6 gui- מריצים את 2

11

Page 12: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

כמו שמופיע באיורopencv 2.1.0 zip" יש לכתוב איפה חולץ ה source code- בחלון ה "3

cmake- source code –2איור מס'

12

Page 13: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

”C:\OpenCV\build“, אנחנו בחרנו binaries- יש לבחור את מיקום בניית ה 4

cmake- binaries destination- 3איור מס'

Visual“ ואז תקבל את החלון שמופיע באיור למטה ואז לבחור ב configureיש ללחוץ -5Studio 10″ . וללחוץ עלfinish

13

Page 14: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

cmake- chosen generator-4איור מס'

ולחכות עד שלחצן הconfigure- יש לבחור את כל הריבועים שמסומנים באדום, ללחוץ 6generate .יופעל וללחוץ עליו

ואזfile -> open תבחר Microsoft Visual Studio 2010 Professional-תפת את 7project/sultion

” ואז פתח את “C:\OpenCV\build“, במקרה שלנו זה4-תבחר במיקום שבחרת בצעד 8OpenCV.sln ”

14

Page 15: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

opencv.sln- הפעלת ה 5איור מס'

יהיה מוכן.Visual Studio 2010 Professional- יש לחכות עד מציאת כל הקבצים וה 9

.BUILD menu מ ה choose BUILD SOLUTION-בחר את 10

-יש לסגור את כל התוכנות11

”, ואזAdvanced System Settings”, ואז תלחץ על“My Computer” -> “system Properties- תפתח את “12”Advanced System Settingsללחוץ על-< “

.edit” אחר כך Path” תבחר “System variables”. ב “Environment variablesואז “

ok” ואז C:\OpenCV\build\lib\Debugתוסיף ; בסוף בטקסט המקורי ואז יש להוסיף “

.

15

Page 16: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

pathל opencv- הוספת 6איור מס

יש להפעיל את המחשב מחדש, צעד זה ימנע opencv-כדי שתוכל להשתמש ב 13 שגיאות מוזרות.

open Microsoft Visual Studio 2010 Professio-אחרי שהמחשב יעלה מחדש תפתח את ה14.new projectותבחר

ותן שם מתאים.Win32 console applicationתבחר -15

.

16

Page 17: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

vs- פרוייקט חדש ב7איור מס'

-המשךvs- פרוייקט חדש ב8איור מס

.project menu מ ה properties-תבחר 16

VC++ Directoriesבחר ב .INCLUDE directories” בלשונית C:\OpenCV\include\opencvתוסיף “

17

Page 18: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

include directories- 9איור מס

:LIBRARY directories ב יש להוסיף “C:\OpenCV\build\lib\Debug” “C:\OpenCV\src\cv; C:\OpenCV\src\cvaux; C:\OpenCV\src\cxcore;

. SOURCE directoriesיש להוסיף ב

C:\OpenCV\src\highgui; C:\OpenCV\src\ml ”;

18

Page 19: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

library directories & source directories- 10איור מס'

add” את Additional dependencies תוסיף ב “input , אחר כך linkerבחר ב “cv210d.lib; “cxcore210d.lib;” “highgui210d.lib.

Additional dependencies - 11איור מס'

start debugging ואז בחר build menuמ build solution אחרי שתכתוב תוכנית, בחר ב . debug menuמ

http://opencv.willowgarage.com/wiki/VisualC++_VS2010_CMake דוגמא :

#include "stdafx.h"

#include <cv.h>#include <cxcore.h>#include <highgui.h>

int _tmain(int argc, _TCHAR* argv[]){ IplImage *img = cvLoadImage("funny-pictures-cat-goes-pew.jpg"); cvNamedWindow("Image:",1);

19

Page 20: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

cvShowImage("Image:",img);

cvWaitKey(); cvDestroyWindow("Image:"); cvReleaseImage(&img);

return 0;}

התמונה: http://opencv.willowgarage.com/wiki/VisualC%2B%2B_VS2010_CMake?action=AttachFile&do=view&target=funny-pictures-cat-goes-pew.jpg

יש לשמור את התמונה בפרויקט שלך: ->Build -> Build Solution. Debug ->Start Debugging

- תוצאת ההרצה של הדוגמא12איור מס'

cv blobs library הוספת ה

יש להוריד את הספרייה מ:

http://opencv.willowgarage.com/wiki/cvBlobsLib cvblobslib_OpenCV_v8_3.zip

כך שיש לחזור עלopencv יש לזכור שאנחנו משתמשים ב blobsכדי להשתמש ב ספריית ה (.16 ו 15 כחלק מהפרוייקט שלנו )צעדים opencvכך הצעדים שנותנים לנו לעבד עם ה

20

Page 21: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

עכשיו יש לעבור על הצעדים הבאים:

.project menu מ properties - תבחר ב 1

אחר כך בחר את המיקוםLinker -> General ->additional library directoriesתבחר -2.blobsאיפה שמרת את ספריית ה

כספרייה נוספת cvblobs –הוספת ה 13איור מס'

בחר בCode Generation->Use run-time library בחר ב ++ C/Cבלשונית -3Debug Multithreaded DLL

.

21

Page 22: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

runtime library- 14איור מס'

use MFC in shared DLL יש לבחור general ->use of MFCבלשונית

בקוד שבו משתמשים בה.blobs לספריית ה includeיש לעשות -4

#include "BlobResult.h"

דוגמא: , מזהה אותם וצובעת אותםblobsהתוכנה לוקחת תמונה שיש בה

נלקח מ:

http://areshopencv.blogspot.com/2011/09/blobs-with-opencv-internal-function.htmlThe code:

22

Page 23: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

#include "stdafx.h"#include <cv.h>#include <highgui.h>#include <stdio.h>#include <conio.h>#include <cxcore.h>#include "BlobResult.h"#include <stdio.h>#include <vector>#include <iostream>#include "blob.h"

using namespace cv;

#define drawCross( center, color, d, drawing ) \ line( drawing, Point( center.x - d, center.y - d ), \ Point( center.x + d, center.y + d ), color, 2, CV_AA, 0); \ line( drawing, Point( center.x + d, center.y - d ), \ Point( center.x - d, center.y + d ), color, 2, CV_AA, 0 )

RNG rng(12345);

class atsBlobFinder{public: atsBlobFinder(cv::Mat src) { numBlobs = 0; cv::Mat img; cv::cvtColor(src,img,CV_BGR2GRAY); img = img > 1; /

findContours( img, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); vector<Moments> _mu(contours.size() ); vector<Point2f> _mc( contours.size() ); for( int i = 0; i < contours.size(); i++ ) { _mu[i] = moments( Mat(contours[i]), false );

23

Page 24: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

_mc[i] = Point2f( _mu[i].m10/_mu[i].m00 , _mu[i].m01/_mu[i].m00); } mu = _mu; mc = _mc; numBlobs = contours.size(); } void Draw(cv::Mat &dst) { for( int i = 0; i < contours.size(); i++ ) { Scalar color( rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( dst, contours, i, color, CV_FILLED, 8, hierarchy ); char buff[255]; sprintf(buff, "%d", i);

string text = std::string(buff); cv::putText(dst,text,mc[i],0,0.5,Scalar(0,0,255),1,8,false); } } int getNumBlobs() {

char buff[255]; sprintf(buff, "%d", numBlobs); return numBlobs; }private: vector<vector<Point> > contours; vector<Vec4i> hierarchy; vector<Moments> mu; vector<Point2f> mc; int numBlobs;};

int main( int argc, char** argv ){ Mat src; if(!(src=imread("pic1.png", CV_LOAD_IMAGE_GRAYSCALE)).data) {

24

Page 25: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

printf("OOOPS"); waitKey(0); return -1; }

Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);

src = src > 1; namedWindow( "Source", 1 ); imshow( "Source", src );

vector<vector<Point> > contours; vector<Vec4i> hierarchy;

findContours( src, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

vector<Moments> mu(contours.size() ); vector<Point2f> mc( contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mu[i] = moments( Mat(contours[i]), false ); mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00); }

for( int i = 0; i < contours.size(); i++ ) { Scalar color( rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( dst, contours, i, color, CV_FILLED, 8, hierarchy ); char buff[255]; sprintf(buff, "%d", i);

string text = std::string(buff); cv::putText(dst,text,mc[i],0,0.5,Scalar(0,0,255),1,8,false); }

namedWindow( "Components", 1 ); imshow( "Components", dst ); waitKey(0);

25

Page 26: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

}

תוצאת ההרצה:

cv Blob- תוצאת הרצה לדוגמא 15איור מס'

26

Page 27: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

לקבצי הספרייה לתוך הפרוייקט כמו שמופיע include : אין לעשות הערה חשובה באיור למטה, אחרת נקבל שגיאות והקוד לא יעבוד, בפרוייקט מוסיפים את הקודים

שכתבנו בלבד.

- הכלה שגוררת שגיאות16איור מס'

מצב כזה יגרור שגיאות בהרצה לכן יש להמנע ממנו.

27

Page 28: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

נציין שאותה תוצאה אפשר לקבל במטלב בעזרת שורות קוד בודדות מה שמבליט את++ ולא כתיבת הכל מאפס.Cהצורך במציאת המעבר היעיל ביותר ממטלב ל

-דוגמא במטלב17איור מס'

28

Page 29: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

Matlab coder

קוד מטלב נתון, והוא מספק אפשריות תרגום שונות כגון מייצר פלטים שונים מתוך Matlab coder Mex function-

C/C++ static library-C/C++ dynamic library-

C/C++ executable-

כדי matlab coder נצטרך בהתחלה להגדיר את סוג המהדר שאיתו נעבוד בעזרת שנוכל להשתמש ב

כפי שמתוארים הצעדים בתמונה למטה mex –setupפקודת מטלב

- הגדרת המהדר18איור מס'

29

Page 30: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

ללא בעיות עם המהדר. matlab coderעכשיו אפשר להשתמש ב

השלב הראשון לתרגום כל קוד הוא הבנתו לכן צריך לעבור על הקוד ולהבין אותו ומה הוא אמור לעשות, במקרה שלנו הקוד שתרגמנו מטרתו היתה עקיבת ווידיו מהירה אחרי עצמיםבתנועה אקראית תוך התחשבות במאפייני הגוף כגון מהירות ) קווית וזוויתית ( תאוצה וכו'

האלגורתם מנבה את מיקןם העצם הצפוי ב"פריים" הבא על סמך הפריים הנוכחי ומאפייניהגוף.

יתןMatlab’s m-Lintכדי שהקוד יעבור תרגום הקוד צריך להיות נקי משגיאות ומהערות כך ש ה אור ירוק

אחרי ההצהרה על שם הפונקציה codegen%#בנוסף יש להוסיף את השורה

matlab’s m-Lint- 19איור מס'

30

Page 31: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

ניסיון ראשון

על מנת לספק את דרישות המטלב יש לעבור על כל המקומות המסומנים בקוד כשגיאה או כהערה ולנסות למצוא דרך לספק את דרישות המטלב ולשמור על אותה התנהגות רצויה של

הפונקציה וכאן נדגים את הבעיות שנתקלנו בהם ואת צורת הפתרון.

ולאחר שהבנוiptcheck functionsבנוסף מחקנו את כל הפונקציות שקשורות לקלט\פלט וה מריצת הקוד המקורי את גדלי הפרמטרים השונים הוספנו הגדררות של אותם פרמטרים שהיינו

roipolyאמורים לקבל מתוך ריצת פונקציות הקלט/פלט וה

Regionprops למשל הפרמטר BW שמקבל את ערכו כתוצאה מהרצת ה roipolyנקבע להיות הרץ .frameמטריצה בגודל מתאים ל

ראינו שיש חלק מהפונקציות שלא ניתן לתרגם אלא אם נוסיף coderבבדיקה בתיעוד של ה " זאת על ידיcodegen לספרייה שלנו ולהוסיף את השורה "%# toolboxאותו ידנית מ ה

edit אינן נתמכות לכן השתמשנו בפקודה datawrap ו cconv למשל הפונקציות editהפקודה " ונשמור את הפונקציה בספרייה שלנו.codegenנוסיף את "%#

31

Page 32: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

cconv- עריכת פונקציית 20איור מס'

שגיאות והערות נוספות והפתרון שלהן.

1.

פתרון: לעדכן את שם הפונקציה כשם הקובץ.

2.

פתרון: להחליף ב ) ( במקום ] [.

3.

.j במקום 1iפתרון: לרשום

4.

פתרון: להחליף את הפרמטרים שלא משתמשים בהם ב~.

5.

בהתאם למקרה המטופל מה שגרר צורך בשינוי בקוד preallocateפתרון: להשתמש ב מבלי לפגוע בהתנהגותו

32

Page 33: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

לדוגמא

preallocate- דוגמא ל 21איור מס'

ובצהוב השינוי שעבר הקוד מבלי לפגוע בהתנהגותו.עכשיו כש preallocteבאדום מסומן ה Matlab’s m-Lint.נתן אור ירוק אפשר לתרגם את הקוד

33

Page 34: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

project בוחרים שם ל overview בלשונית coder על ידי פקודת המטלב coderמפעילים את ה build בוחרים בקובץ שרוצים לתרגם עוברים ללשונית add files , לוחצים על okולוחצים

. וכדי לקצר את הקוד המיוצר הורדנוgenerate code only ומסמנים C/C++ executableבוחרים ב את אופציית תמיכת מספרים אינסופיים .

coder- הפעלת ה 22איור מס'

34

Page 35: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

- תמיכה\אי תמיכה במספרים אינסופיים 23איור מס

custom code בלשונית main יש לספק פונקצית executable outoput fileכאשר מייצרים ובmain לבחור בתיקייה שבה שמור ה additional include directoriesושם באופציה

additional source files לבחור בקובץ ה main.

לבחור בשפת התרגום הרצויה, בנוסף כדי advanced תחת האופציה all settingsבלשונית תחתgenerate all functions into a single file שלא נקבל הרבה קבצי פלט נבחר באופציה

code appearance

35

Page 36: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

advanced settings – 24איור מס'

buildעכשיו ננסה לתרגם את הקוד על ידי לחיצה על

במטלב אחרי כל השינוייםfully functionalהערה: כדי שהתרגום יהיה נכון הקוד צריך להיות שנעשו

תוצאות התרגום

לא הצלחנו לתרגם ונקבל את השגיאה הבאה:

36

Page 37: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

- שגיאה בתרגום- מחיקת אלמנטים לא נתמכת25איור מס'

שגיאה שאומרת שמחיקת אלמנטים ממטריצה אינה נתמכת, הפתרון שלנו לבעייה זו היה matlab 2012 יותר עדכנית שבה אופציה של מחיקת אלמנטים נתמכת )matlabמעבר לגרסת

a.ואז לא מקבלים את השגיאה הזו )

שגיאה אחרת שקבלנו היא:

ולפי הצעת המטלב הציע implicitly resolved in the Matlab שהן get ו exitפונקציות כמו לכן סגרנוstandalone code שזה פתרון לא טוב אם ברצוננו לייצר coder.extrinsicלהשתמש ב

++ קוד.cאת הקריאות לפונקציות האלו ונוסיף אותן בחזרה ב

אפשרות אחרת להתקל בשגיאה מהסוג :

37

Page 38: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

- שגיאת תרגום- מימדים לא תואמים26איור מס'

שמראה אי תאימות במימדים בין שני משתנים שיש ביניהם הצבה אחד לתוך השני וכאן נעזרים שמצהירה על שהמימדים של הפרמטר יכולים להשתנות בטווחcoder.varsizeבאופציה של נתון, לדוגמא:

לא תומך בפקודת == coderשגיאה אפשרית היא שה

isequalהפתרון להשתמש בפקודה

עכשיו הקוד עובר תרגום בהצלחה אולם חלק מהפונקציות אינו מופיע במפורש הקוד שנוצר ש"נבלעה" בתוך פונקציה אחרת, לכן על מנת שכל הפונקציותarrangeכגון הפונרציה

בכל פונקציהcoder.inline(‘never’)המתורגמות יופיעו בקוד הנוצר יש להוסיף את הפקודה בנפרד.

עכשיו הקוד אמור לעבור תרגום בהצלחה ואפשר להשתמש בפלט שלו.

. visual studio כעת עוברים לעבוד ב

visual studio עבודה ב

38

Page 39: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

ותחתproject properties יש לעבור ל visual studioכדי שהקוד יעבוד הצורה תקינה ב not use לבחור precompiled headers וב ++ C/C לבחור ב configuration propertiesהאופציה

precompiled headers

precompiled header- 27איור מס'

אחרי הרצה ראשונה של הקוד מקבלים שיש שגיאת זמן ריצה- כלומר יש לולאות אינסופיותבפלט שקבלנו

לכן עברנו על הלולאות הבנו מה הן אמורות לעשות ותיקנו לדוגמא:

39

Page 40: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

בירוק מופיע המצב לפני התיקון.

regionprops כעת נוסיף את כל הפונקציות שסגרנו בקוד המקורי כמו פונקציות הקלט/פלט הוכו'.

יש להתאים את ההגדרות של הפרוייקטopencvראשית כל כדי שנוכל להשתמש בספריית ה .opencv tutorialכמו שהסברנו ב

יש להשתמש בפקודות הבאות.gray ל frameכדי לפתוח את הסרט ולהמיר את ה

- קריאת ווידאו28איור מס

שבעזרתה נבחר את הנקודות של הגוף שנרצה לעקובmousehandlerממשנו את הפונקציה שמקבלת שניcvSetMouseCallback שנקראת opencvאחריו ונעזרנו בפונקציה מספריית

פרמרטים שהשני ביניהם הוא הפונקציה שממשנו.

40

Page 41: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

מימושmousehandler- 29איור מס

הנוכחי שמעדכן את המטריצה, נעזרים frameכדי לקבל את ערכי הפיקסלים של ה .opencv cvGet2Dבפונקצית ה

הוציא ממלא את הערכים עמודה אחרי עמודה. coderיש לשים לב שה קוד ש ה

- קבלת ערכי הפקסלים30איור מס'

hull העדכניים יצרנו תמונה שבה הנקודות שהחרנו מגדירות BWכדי להעביר את ערכי ה convex לבן על רקע שחור נעזרנו בפונקצית opencv cvFillConvexPolyשמקבלת נקודות

בנקודה.BW מחליטים מה ערך ה pixel מתאים ועל ידי בדיקת ערך הhull convexומחזירה

BW- העברת ערכי ה 31איור מס

41

Page 42: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

במטלב השתמשנוregionprops שמחושבים על ידי orientation ו ה centroidכדי לחשב את ה שמחשבת את המומנטים של התמונה ובעזרתם ניתן לחשב את מרכז המסהcvMomentsב

והאוריינטציה

- חישוב מרכז מסה ואוריינטציה32איור מס'

חדש יש להשתמש בפקודות הבאות: frameכדי לקבל כל פעם

42

Page 43: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

- קבלת פרימים ברצף33איור מס

מחדש בהתאם למה שעשינו באתחול.frameעבור כל BW וה Iיש לעדכן את ערכי ה

opencv שהורדנו מקוד המטלב יש להוסיף את פקודת ה strel(‘disk’,3)במקום הפקודה cvCreatStructingElementEx(5,5,2,2,CV_SHAPE_ELIPSE).

.cvDilate נשתמש בפקודה imdilateובמקום פקודת המטלב

שנוצר מהנקודות אחרי עיבוד יש להעתיק את הנקודות לפורמטhullלבסוף כדי לייצר את ה ולאחר מכך להשתמש בפונקציותopencv (cvPoint )נקודות שיתאים לפונקציות ה

cvConvexHull2 ו cvLine.

43

Page 44: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

hull- ייצור 34איור מס

תוצאות

מריצים את הקוד בוחרים את הנקודות )לחצן עכבר ימני כדי לבחור את הנקודה הראשונה, נקודות על ידי לחצן עכבר שמאלי ונקודה אחרונה על ידי לחצן עכבר אמצעי( אחר3אחר כך

פעמיים והקוד רץ ויש עקיבה רק בפרימיים הראשונים.0כך לוחצים על

במטלב כפונקציהsobolevsnakeפתרון שמצאנו לבעייה זו הוא הגדרת הפונקציה הראשית וסגרנוcoderשמקבלת פרמטרים, פרמטרים אלה מסופקות על ידי פונקציות שלא נתמכות ב

אותן כפי שהוסבר לפני .

עכשיו הפונקציה אותהprev_cent,prev_prev_cent,cent orient,prev_orientפרטרים אלה הם מתרגמים מקבלת פרמטרים ויש להגדיר את סוגם לפני התרגום כפי שמופיע האיור:

coder- הגדרת פרמטרים ב 35איור מס'

44

Page 45: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

לפונקציה שלא מקבלת פרמטרים ב sobolevsnakeלאחר עדכון הקוד והחזרת הפונקציה visual studioהרצנו את הקוד מחדש והיתה מושלמת אבל לקראת סוף הריצה ה hullהתחיל

להשתולל ומקבל צורות מוזרות.

לאחר כמה נסיונות התברר שזו בעיה של זיכרון מכיוון שכאשר פינינו חלק מהזיכרון העקיבההיתה מושלמת עד הסןף.

: visual studioלהלן מוצגות תוצאות השוואה בין הרצה ב מטלב לבין התוצאות ב

45

Page 46: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

46

Page 47: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

–השוואה בין תוצאות36איור מס

בשלב זה נסינו להריץ הקוד עם סרט ווידאו אמיתי לא סינטטי ולא הצלחנו הקוד נכנס ללולאה היא הפונקציה שגורמת לכך שיש לולאה אינסופית , נסינוevolveאינסופית, ראינו שהפונקציה

לדבג אותה כדי לראות איפה היא בדיוק נופלת ללא הצלחה, בנוסף נסינו לתרגם את לבדה ולשלב אותה עם הקוד שקבלנו קודם גם נסיון זה לא הצליח.evolveהפונקציה

סיכום ומסקנות

מניתוח התוצאות וממהלך העבודה התקבלו כמה מסקנות עיקריות שהן :

מוגבלת למדי בתחום לראיה ממוחשבת )לפחות בגרסאותcoderיכולת התרגום של ה ( מה שהופך את ביצוע התרגום למסורבל לפעמים. ומחוץ לתחוםcoderהראשונות של ה

ראיה ממוחשבת ,יש כמה אתגרים שיש להתגבר עליהם כגון מחיקת איברים ממטריצה או שינוי ,פונקציות קלט פלט ועוד ,מה שמחייב הבנהpre-allocationגדלי איברים מסוימים ,בעיות

מעמיקה של הקוד שנתון במטלב .

47

Page 48: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

אינו אינטואיטיבי ומצריך ידע מוקדם ומספיקcoder (++C)הקוד המתורגם שמתקבל כפלט מ ה, Cבשפת ++

כך שיש לעקוב אחרי הרבה שורות קוד ואפילו לתקן בקוד המיוצר שתתכן שתקבל שגיאותבקוד המתורגם.

למשל איךcoderבמקרים מסוימים יש לבצע את התרגום כמה איטירציות כדי להבין איך ה המטריצה מוגדרת ואיך הוא ממלא מטריצה בערכים )הוא ממלא עמודות ולא שורות למשל (.

בתוספת הדברים שהוספנו עלול לעבודcoder מסקנה אחרונה היא שהקוד שהתקבל מה בצורה תקינה ומדויקת למדי בהשוואה לתוצאות שהתקבל במטלב עם סרטים סנטטים בלבד

אולם לסרטים אמיתיים זה לא עבד .

ביבליוגרפיה :

48

Page 49: webee.technion.ac.il · Web viewמאחר ורוב פיתוחי האלגוריתמים נעשים ב-MATLAB, ורוב המימושים בעולם האמיתי נעשים ב C++ אנו

;

http://opencv.willowgarage.com/wiki / http://www.mathworks.com/products/matlab-coder http://opencv.willowgarage.com/wiki/cvBlobsLib cvblobslib_OpenCV_v8_3.zip OpenCV 2 computer Vision application programming cookbook (by Robert Laganiere)

49