רופישל matlab-opencv קשממ ואדיו יבקוע לש...

45
1 דוח פרויקט : פרויקט סמסטריאלי הנושא: ממשקMATLAB-OpenCV לשיפור ביצועים של עוקבי וידאו מגישים: רביע עראבה רביע שלש מנחה: אריה נחמני סמסטר: חורף תשע"ג הטכניון- מכון טכנולוגי לישראלTECHNION - ISRAEL INSTITUTE OF TECHNOLOGY הפקולטה להנדסת חשמל המעבדה לבקרה רובוטיקה ולמידה חישובית

Upload: ngonhan

Post on 15-Apr-2018

245 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

1

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

:הנושא

לשיפור MATLAB-OpenCVממשק

ביצועים של עוקבי וידאו

:מגישים

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

:מנחה

אריה נחמני

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

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

הפקולטה להנדסת חשמל

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

Page 2: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

2

:תודות

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

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

מר קובי כוחיי

גב' אורלי ויגדרזון

Page 3: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

3

ענייניםהתוכן 4-5.... ........................................................................................................ רשימת איורים.1

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

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

8………...................................................................................................................…….מבוא 4

9-34....תאור כללי...................................................................................................................5

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

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

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

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

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

41-43............................................ תוצאות ...........................................................................6

44.................................................................................................................סיכום ומסקנות7

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

Page 4: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

4

איורים רשימת

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Page 5: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

5

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

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

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

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

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

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

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

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

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

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

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

Page 6: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

6

תקציר

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

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

.הכל מהתחלה

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

מונחה עצמים.

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

Page 7: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

7

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איור מס'

Page 8: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

8

מבוא

הצגת הבעיה:

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

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

. visual studio לקמפל ב

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

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

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

Page 9: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

9

תיאור כללי

ואת כל סביבת העבודה הדרושה לביצוע זאת כגון Simple itkבחלק הראשון של הפרויקט נסינו להתקין את

Visual studio ,cmake,Cygwin,svn,slicer3

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

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

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

linuxשמדמה מערכת הפעלה של בתוך סביבת עבודה

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

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

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

Page 10: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

10

ולשימוש בה 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

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

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

יעזור לך( 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

Page 11: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

11

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

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

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

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

Page 12: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

12

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

finishוללחוץ על

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

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

וללחוץ עליו.

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

Page 13: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

13

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

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

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

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

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

Page 14: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

14

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

”Advanced System Settings“ <-ללחוץ על

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

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

.

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

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

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

new project.

Page 15: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

15

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

.

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

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

Page 16: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

16

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

VC++ Directoriesבחר ב

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

include directories -9איור מס

: LIBRARY directories ב יש להוסיף

“C:\OpenCV\build\lib\Debug” “C:\OpenCV\src\cv;

C:\OpenCV\src\cvaux; C:\OpenCV\src\cxcore;

Page 17: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

17

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

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

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

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

“cxcore210d.lib;” “highgui210d.lib.

Additional dependencies - 11איור מס'

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

debug menu .

Page 18: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

18

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);

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איור מס'

Page 19: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

19

blobs librarycvהוספת ה

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

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

cvblobslib_OpenCV_v8_3.zip

כך שיש לחזור על כך הצעדים opencvיש לזכור שאנחנו משתמשים ב blobsכדי להשתמש ב ספריית ה

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

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

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

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

.blobsשמרת את ספריית ה

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

Page 20: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

20

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

Debug Multithreaded DLL

.

runtime library -14איור מס'

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

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

#include "BlobResult.h"

Page 21: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

21

דוגמא:

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

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

The code:

#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);

Page 22: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

22

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 ); _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; };

Page 23: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

23

int main( int argc, char** argv ) { Mat src; if(!(src=imread("pic1.png", CV_LOAD_IMAGE_GRAYSCALE)).data) { 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);

Page 24: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

24

cv::putText(dst,text,mc[i],0,0.5,Scalar(0,0,255),1,8,false); } namedWindow( "Components", 1 ); imshow( "Components", dst ); waitKey(0); }

תוצאת ההרצה:

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

Page 25: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

25

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

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

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

Page 26: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

26

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

.ולא כתיבת הכל מאפס ++Cהמעבר היעיל ביותר ממטלב ל

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

Page 27: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

27

Matlab coder

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

coder

Mex function-

C/C++ static library-

C/C++ dynamic library-

C/C++ executable-

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

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

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

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

Page 28: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

28

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

במאפייני הגוף כגון מהירות ) קווית וזוויתית ( תאוצה וכו'

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

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

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

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

Page 29: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

29

ניסיון ראשון

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

שנתקלנו בהם ואת צורת הפתרון.

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

roipolyפונקציות הקלט/פלט וה

Regionprops למשל הפרמטרBW שמקבל את ערכו כתוצאה מהרצת הroipoly נקבע להיות מטריצה

הרץ . frameבגודל מתאים ל

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

למשל הפונקציות edit" זאת על ידי הפקודה codegen#%לספרייה שלנו ולהוסיף את השורה " toolboxה

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

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

Page 30: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

30

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

1.

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

2.

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

3.

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

4.

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

5.

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

Page 31: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

31

לדוגמא

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

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

Lint נתן אור ירוק אפשר לתרגם את הקוד.

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

executableC/C ++בוחרים ב buildבוחרים בקובץ שרוצים לתרגם עוברים ללשונית add files, לוחצים על

תמיכת מספרים אופצייתוכדי לקצר את הקוד המיוצר הורדנו את .generate code onlyומסמנים אינסופיים .

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

Page 32: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

32

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

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

additional sourceוב mainלבחור בתיקייה שבה שמור ה additional include directoriesבאופציה

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

Page 33: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

33

כדי שלא נקבל בנוסףלבחור בשפת התרגום הרצויה, advancedתחת האופציה all settingsבלשונית

code appearanceתחת generate all functions into a single file הרבה קבצי פלט נבחר באופציה

advanced settings – 24איור מס'

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

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

Page 34: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

34

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

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

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

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

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

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

Page 35: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

35

ולפי הצעת המטלב הציע להשתמש ב implicitly resolved in the Matlabשהן getו exitפונקציות כמו

coder.extrinsic שזה פתרון לא טוב אם ברצוננו לייצרstandalone code לכן סגרנו את הקריאות

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

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

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

שמראה אי תאימות במימדים בין שני משתנים שיש ביניהם הצבה אחד לתוך השני וכאן נעזרים באופציה של

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

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

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

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

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

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

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

Page 36: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

36

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

ual studiosvi עבודה ב

ותחת האופציה project propertiesיש לעבור ל visual studioכדי שהקוד יעבוד הצורה תקינה ב

configuration properties לבחור בC/C++ ובprecompiled headers לבחורnot use precompiled

headers

precompiled header -27איור מס'

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

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

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

Page 37: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

37

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

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

opencv tutorial.

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

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

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

שמקבלת שני פרמרטים שהשני ביניהם הוא cvSetMouseCallbackשנקראת opencvבפונקציה מספריית . הפונקציה שממשנו

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

Page 38: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

38

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

cvGet2D.

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

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

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

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

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

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

Page 39: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

39

במטלב השתמשנו ב regionpropsשמחושבים על ידי orientationו ה centroidכדי לחשב את ה

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

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

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

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

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

Page 40: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

40

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

cvCreatStructingElementEx(5,5,2,2,CV_SHAPE_ELIPSE) .

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

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

.cvLineו cvConvexHull2( ולאחר מכך להשתמש בפונקציות cvPoint) opencvלפונקציות ה

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

Page 41: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

41

תוצאות

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

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

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

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

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

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

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

תחיל להשתולל ומקבל צורות ה hullמושלמת אבל לקראת סוף הריצה ה והיתה הרצנו את הקוד מחדש מוזרות.

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

Page 42: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

42

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

Page 43: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

43

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

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

היא הפונקציה שגורמת לכך שיש לולאה אינסופית , נסינו לדבג אותה כדי לראות evolveראינו שהפונקציה

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

Page 44: רופישל MATLAB-OpenCV קשממ ואדיו יבקוע לש םיעוציבwebee.technion.ac.il/control/info/Projects/Students/2012/Rabia... · 1 ילאירטסמס טקיורפ

;

44

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

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

מוגבלת למדי בתחום לראיה ממוחשבת )לפחות בגרסאות הראשונות של ה coderיכולת התרגום של ה

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

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

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

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

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

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

.לא עבד