PDA

View Full Version : آموزش OpenCV



amin1softco
سه شنبه 02 اسفند 1390, 10:33 صبح
دوستان من زیاد با بینایی ماشین کار نکردم ولی اگر کسی باشه دوست دارم آموزش OpenCV رو در این تاپیک ادامه بده چون خیلی بهش علاقمند شدم.:لبخند: خودم دست و پا شکسته مطلب پیدا کنم اینجا قرار می دم.

مصطفی ساتکی
سه شنبه 02 اسفند 1390, 19:42 عصر
دوست عزیز opencv یک کتابخانه است و wiki آن آنقدر تکمیله که نیازی به آموزش مجدد نداره همچنین چت IRC هم وجود داره #opencv هستش اگر سوالی دارید مطرح کنید پاسخ داده میشه.
این کتابخانه حدود 500 تابع داره و نسخه های اولیه تحت ansi C در intel پیاده سازی شده نسحه های جدید اون تحت C++‎‎ هستش و از کتابخانه Boosting هم استفاده میشه و در پلت فرم های win و linux و mac و android قابل استفاده هستش و تو اکثر debuger ها قابل استفاده است wrapper های مختلفی هم به برای زبان های مثل C#‎‎ و جاوا و غیره طراحی شده .
مهم ترین کار تو پردازش تصویر دونستن اسامی توابع نیست بلکه یادگیری پردازش تصویر ، بینایی ماشین ، تشخیص الگو مطرحه .مثلاً بعضی افراد می بینم نمونه کد ها موجود در کتابخانه رو اجرا می کنند خیلی بهشون خوش میگذره .سوال من اینه آیا کسی که علمی با مقوله برخورد نکنه می تونه پروژه های کاربردی run کنه.
به هر حال پیشنهاد میدم یادگیری تون رو ، روی اون 3 فیلدی که ذکر کردم متمرکز کنید و سوالاتون مطرح کنید نیاز باشه کد ها رو هم با opencv اینجا قرار می دیم.
تو این سایت (http://www.7khatcode.com/) هم می تونید مطالب مفیدی در مورد OpenCV یاد بگیرید.

amin1softco
چهارشنبه 03 اسفند 1390, 11:40 صبح
بلاخره باید از یک جایی شروع کرد برای یک مبتدی خیلی خوبه که بتونه یک برناممه ساده رو حتی ران کنه
ولی من نگفتم اسم توابع رو اینجا بنویسیم با توضیحاتش شما یک مثال بزنید که می خواهیم فلان کار رو انجام بدیم حالا برای انجام این کار باید با این توابع آشنا باشید و توضیح مختصر و بعدم مثال رو حل کنید. روالی که در بیشتر کتاب ها معتبر دنبال می شه ....
مثلاً همین سیستم پلاک خوان باید از چه توابعی استفاده کنیم؟!

پ.ن:یکبار آقای گلبافان یک برنامه درست کرده بود خیلی خوشم اومد الان در امضا شما دیدمش

sara90
پنج شنبه 11 اسفند 1390, 09:45 صبح
با سلام خیلی خوشحالم که این تالار درست شده منم با نظرamin1softcoعزیز موافقم و دوست دارم به این شیوه که یه پروژه مثال زده بشه وآموزش داده بشه ازاساتید گرامی ممنون میشم یکی شروع کنه این کار رو با تشکر.

h0x00i
جمعه 26 اسفند 1390, 17:52 عصر
خوب بهتر نیست بجای بحث های انحرافی شروع کنیم ؟

black_wear
دوشنبه 07 فروردین 1391, 09:17 صبح
سلام
اینا رو ببینید بد نیست:
آموزش قدم به قدم opencv (http://www.mojsazan.com/forum/showthread.php?tid=603)
منابع یادگیری OpenCV (http://www.mojsazan.com/forum/showthread.php?tid=1899)
و...

rayson
چهارشنبه 09 فروردین 1391, 13:17 عصر
دوست عزیز این لینک که قرار دادی برای محیط ubuntu هم میشه ازش استفاده کرد؟

black_wear
جمعه 11 فروردین 1391, 21:30 عصر
اینا لینکهایه آموزشی هستند،
اما در کل opencv در لینوکس هم جواب میده

kamakama
جمعه 05 خرداد 1391, 14:00 عصر
سلام
ميشه در مورد رپرهاي opencv بيشتر توضيح بدين.
مثلا اين كه مفهوم رپر چيه ؟آيا همه امكانات open cv رو دارن؟انواع رپر ها؟
آيا رپر Emgucv براي كار در سي شارپ بهترين گزينست؟

amin1softco
دوشنبه 29 خرداد 1391, 14:48 عصر
شروع کار با OpenCV

برای شروع کار با OpenCV ابتدا باید، کتابخانه آن را دریافت کرده و نصب کنید. برای دریافت OpenCV روی لینک زیر کلیک کنید و آخرین نسخه را دانلود کنید:
دانلود نسخه 2.1 OpenCV (http://sourceforge.net/projects/opencvlibrary/files/)
پس از نصب کتابخانه، باید مسیر فایلهای آن را در ویژوال استودیو اضافه کنید. مثلا اگر آن را در مسیر E:\OpenCV2.1\ نصب کرده اید، باید مسیر E:\OpenCV2.1\include\opencv را به Include Directories و مسیر E:\OpenCV2.1\lib را به Library Directories اضافه کنید. بهتر است به پوشه lib رفته و تمام پسوندهای 210 را از کتابخانه پاک کنید تا در صورت به روز رسانی، نامگذاری فایلهای کتابخانه اشکال ایجاد نکند. مثلا cv210.lib را به cv.lib تغییر دهید. حال آماده ایم تا اولین برنامه را بنویسیم.
در اولین برنامه قصد داریم فقط یک تصویر را نمایش دهیم.
یک پروژه کنسول ایجاد کنید و خطوط زیر را در آن بنویسید:

// in the name of allah
// The first Open CV example
// Developed by http://www.P30CodeNevis.ir
// 2010-11-11

#include "stdafx.h"

// include standard OpenCV headers
#include "cv.h"
#include "highgui.h"

#ifdef _DEBUG
#pragma comment (lib, "highguid.lib")
#pragma comment (lib, "cxcored.lib")
#else
#pragma comment (lib, "cxcore.lib")
#pragma comment (lib, "highgui.lib")
#endif

//0 to use new style, 1 for old style
#define USE_OLD_STYLE 1

using namespace cv; // for new c++ style

int main( int argc, char** argv )
{
const char* imagename = argc > 1 ? argv[1] : "camera-man.jpg";

#if USE_OLD_STYLE
/////////////////////////////////////////////////////////////////
/// old C style
IplImage* img = cvLoadImage(imagename);
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
cvShowImage( "Example1", img );
cvReleaseImage( &img );
#else
/////////////////////////////////////////////////////////////////
/// New C++ style (its also very similar to MATLAB style)
// Unfortunately this new style has some bugs and may produce exceptions
Mat img = imread(imagename);
namedWindow("Example1", CV_WINDOW_AUTOSIZE );
imshow("Example1", img);
//img is an instance of class Mat and will be destroyed automatically so we do not call cvReleaseImage
#endif

cvWaitKey(0);
cvDestroyWindow( "Example1" );
}



توضیح برنامه

دو فایل cxcore.lib و highgui.lib و یا نسخه های دیباگ آنها که پسوند d دارند، برای کار با تصویر و نمایش آن در پنجره لازم هستند. چند خط اول برنامه مسئول این کار هستند. متاسفانه یا خوشبختانه OpenCV در حال پوست انداختن است و قصد دارد ساختار قدیمی خودش را که با C خالص بود تغییر داده و به سمت ++C مهاجرت کند و از نسخه 2 به بعد این کار را آغاز کرده است. لذا در حال حاضر هم ناچار است توابع قدیمی را پشتیبانی کند و هم ساختار شیءگرا را در قالب فضای نام cv اضافه کرده است. در این برنامه امکان استفاده از هر دو ساختار وجود دارد، تنها کافیست مقدار USE_OLD_STYLE را بین صفر و یک عوض کنید.
تصویری که قرار است بارگذاری کنیم یا به عنوان پارامتر ارسال می شود یا باید اسمش camera-man.jpg باشد! و در مسیر پروژه قرار داشته باشد. برای بارگذاری تصویر به ساختار قدیمی از تابع cvLoadImage استفاده می کنیم که خروجی آن اشاره گری به یک struct از نوع IplImage است و در ساختار جدید از imread و خروجی آن از نوع کلاس Mat است (شبیه توابع MATLAB ). تابع cvNamedWindow یا namedWindow برای ایجاد یک پنجره ساده است و در نهایت تابع cvShowImage یا imshow برای نمایش تصویر روی پنجره می باشد.
تابع cvWaitKey با پارامتر صفر آنقدر صبر می کند تا کلیدی فشرده شود.
دقت داشته باشید در حالت استفاده از توابع ++C احتمال زیاد باخطاها و exception های عجیب و غریب روبه رو خواهید شد و برنامه به خوبی اجرا نمی شود. دلیلش در همان پوست انداختن است. به عبارتی باگ دارد!
اگر خدا بخواهد و مشتری پیدا شود، برنامه های پیشرفته تری! هم با OpenCV خواهیم نوشت.
دانلود پروژه تحت visual C++‎ 2010 (http://p30codenevis.ir/CPP-Samples/OpenCV_Exam01.zip)

منبع (http://p30codenevis.ir/cpp-programming/126-open-cv-hello-world.html)

amin1softco
دوشنبه 29 خرداد 1391, 14:51 عصر
پردازش تصویر به کمک OpenCV : لبه یابی و تغییر اندازه
اکنون قصد داریم برنامه ای برای یافتن لبه های تصویر و تغییر اندازه آن بنویسیم. OpenCV توابع زیادی برای کار با تصاویر دارد. در این مثال از 5 تابع cvCanny، cvSobel، cvResize، cvConvertScale و cvSplit استفاده خواهیم کرد که هر کدام را اگر یک تازه کار بخواهد بنویسد شاید چند روز یا حتی چند هفته وقت بگیرد. خوب بهتر است به کد برنامه نگاهی بیندازیم:
نکته: به دلیل خطاهای غیر قابل پیش بینی که در کلاسهای c++ معرفی شده در نسخه 2.1 اتفاق می افتد، فعلا از خیر این کلاسها می گذریم و از همان توابع C آن استفاده می کنیم.

// in the name of allah
// The second OpenCV example
// Working with some image processing functions like edge detectors
// Developed by http://www.P30CodeNevis.ir
// 2010-11-25

#include "cv.h"
#include "highgui.h"

//Canny Edge Detector
IplImage* doCanny( IplImage* in, double lowThresh, double highThresh, int aperture)
{
if(in->nChannels != 1)
return(0); //Canny only handles gray scale images
IplImage* out = cvCreateImage( cvGetSize(in), IPL_DEPTH_8U, 1 );
cvCanny( in, out, lowThresh, highThresh, aperture );
return( out );
};

//Sobel Edge Detector
IplImage* doSobel( IplImage* in, int xOrder, int yOrder, int aperture)
{
if(in->nChannels != 1)
return(0); //Sobel only handles gray scale images
IplImage* temp = cvCreateImage( cvGetSize(in), IPL_DEPTH_16S, 1 );
IplImage* out = cvCreateImage( cvGetSize(in), IPL_DEPTH_8U, 1 );
cvSobel( in, temp, xOrder, yOrder, aperture );
cvConvertScale(temp, out);
cvReleaseImage(&temp);
return( out );
};

//Image Resize
IplImage* doResize( IplImage* in, int filter = CV_INTER_LINEAR )
{
IplImage* out = cvCreateImage(
cvSize( in->width/2, in->height/2 ), in->depth, in->nChannels );
cvResize( in, out, filter );
return( out );
};

int main( int argc, char** argv ) {

const char* imagename = argc > 1 ? argv[1] : "camera-man.jpg";
IplImage* img = cvLoadImage(imagename);

IplImage* resized = doResize(img);
IplImage* g = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
cvSplit(img, 0, g, 0, 0);
IplImage* cedge = doCanny(g, 50, 175, 3);
IplImage* sedge = doSobel(g, 0, 1, 3);

cvShowImage("Original", img);
cvShowImage("Green Channel", g);
cvShowImage("Resized", resized);
cvShowImage("Canny Edge", cedge);
cvShowImage("Sobel Edge", sedge);

cvSaveImage("Green channel.jpg", g);
cvSaveImage("Resized.jpg", resized);
cvSaveImage("Canny Edge.jpg", cedge);
cvSaveImage("Sobel Edge.jpg", sedge);
cvWaitKey(0);

// Release memory and destroy window
cvReleaseImage( &resized );
cvReleaseImage( &g );
cvReleaseImage( &cedge );
cvReleaseImage( &sedge );
cvReleaseImage( &img );
cvDestroyWindow( "Original" );
cvDestroyWindow( "Green Channel" );
cvDestroyWindow( "Resized" );
cvDestroyWindow( "Canny Edge" );
cvDestroyWindow( "Eobel Edge" );

return(0);
}




بارگذاری تصویر مانند مثال قبل، یا از طریق خط فرمان است و یا تصویر camera-man.jpg که باید در مسیر برنامه باشد. برای تغییر اندازه تصویر اصلی از تابع cvResize استفاده می کنیم. این تابع که هم اسم آن و هم رفتار آن مطابق توایع مرسوم تغییر اندازه است، سه پارامتر می گیرد: اولی تصویر ورودی، دومی تصویر خروجی که میزان تغییر مقیاس هم از روی همین تصویر تعیین می شود و سومی نوع الگوریتم است که یکی از چهار مقدار CV_INTER_LINEAR, CV_INTER_NN, CV_INTER_AREA, CV_INTER_CUBIC را می گیرد. این مقادیر به ترتیب برای الگوریتمهای bilinear و binearest neighboura و pixel area resampling و bicubic می باشد. مناسب ترین روش از نظر سرعت و کیفیت همان bilinear است.
توابع cvCanny و cvSobel دو لبه یاب معروف هستند که اولی بار محاسباتی بسیار زیادی نسبت به سوبل دارد. در هر دو مورد، تصویر ورودی باید خاکستری باشد، لذا به کمک cvSplit ما تنها کانال green تصویر را گرفته و به عنوان ورودی به این توابع ارسال می کنیم. کانال green نماینده خوبی از سطح خاکستری تصویر است.
لبه یاب سوبل سه پارامتر می گیرد، اولی نحوه مشتق گیری در راستای افقی (0: عدم مشتق گیری، 1: مشتق اول و 2: مشتق دوم) دومی نحوه مشتق گیری در راستای عمودی و سومی اندازه فیلتر که غالبا 3*3 استفاده می شود. بهتر است تصویر خروجی لبه یاب سوبل از نوع IPL_DEPTH_16S باشد چرا که محاسبات داخلی منجر به مقادیری بیش از یک بایت می شود و لذا برای هر پیکسل از یک عدد صحیح 16 بیتی علامت دار استفاده می کنیم. لیکن برای نمایش تصویر ناچاریم دوباره آن را به IPL_DEPTH_8U (هر پیکسل معادل یک عدد 8 بیتی بدون علامت) برگردانیم که برای این کار از تابع cvConvertScale استفاده می کنیم.
لبه یاب کنی هم سه پارامتر می گیرد، دو تا آستانه پایین و بالا (هر کدام بین 0 و 255) و یکی اندازه فیلتری (مانند فیلتر سوبل) که در داخل canny استفاده می شود. جزئیات بیشتر را از اینجا (http://en.wikipedia.org/wiki/Canny_edge_detector) بخوانید.
سایر کدهای برنامه برای نمایش و ذخیره سازی تصاویر و پاکسازی حافظه است که گمان نمی کنم نیاز به توضیح داشته باشد.
تصاویر خروجی برنامه:

http://p30codenevis.ir/images/opencv/camera-man.jpg تصویر ورودی: camera-man.jpg

http://p30codenevis.ir/images/opencv/Green%20channel.jpg تصویر خاکستری (کانال سبز): Green channel.jpg

http://p30codenevis.ir/images/opencv/Canny%20Edge.jpg تصویر لبه کنی: Canny Edge.jpg

http://p30codenevis.ir/images/opencv/Sobel%20Edge.jpg تصویر لبه سوبل: Sobel Edge.jpg

http://p30codenevis.ir/images/opencv/Resized.jpg تصویر کوچک شده: Resized.jpg
منبع (http://p30codenevis.ir/cpp-programming/127-image-processing-with-opencv.html)

مصطفی ساتکی
دوشنبه 29 خرداد 1391, 20:57 عصر
تو فیلد image processing مهم ترین نکته performance هستش که بایستی رعایت بشه در کد بالا این اصول رعایت نشده. زمانی توابع بایستی تصویر یا ماتریس رو بازگشت بدند که یا عملیات create یا clone صورت بپذیره در بقیه موارد همچون اعمال فیلتر نبایستی توابع مقدار برگشتی شون image باشه
به فرض هزار خط از برنامه در حال تکرار هستش و ما بخایم canny رو اجرا کنیم اگر تابع docanny بالا فراخوانی بشه سربار وجود داره پس شما تصویر رو یک بارساخته و در هربار اون تابع ظرف مورد نظر رو پر می کنه .
موفق باشید

amin1softco
دوشنبه 29 خرداد 1391, 21:36 عصر
به هر حال این یک کد برای تست و آموزش است نه برای یک پروژه تجاری ولی در کل درسته باید روی پرفرمانس خیلی کار بشه که قبول دارم دوست خوبم یک لینک معرفی کرد که به نظرم جالب بود گفتم اینجا قرار بدم بقیه هم استفاده کنند :
http://faculties.sbu.ac.ir/~a_mansouri/DIP.htm
با تشکر از soroushp (http://barnamenevis.org/member.php?u=198775)

مصطفی ساتکی
سه شنبه 30 خرداد 1391, 14:45 عصر
نکته: به دلیل خطاهای غیر قابل پیش بینی که در کلاسهای C++‎ معرفی شده در نسخه 2.1 اتفاق می افتد، فعلا از خیر این کلاسها می گذریم و از همان توابع C آن استفاده می کنیم.

کلاس های opencv مشکلی نداره نحوه استفاده از lib ها اشتباه هستش.
بعنوان مثال lib های release mode در debug mode استفاده میشه که باعث بروز خطا میشه
موفق باشید

amin1softco
سه شنبه 30 خرداد 1391, 15:19 عصر
خوشه یابی با الگوریتم K میانگین در OpenCV
خوشه یابی یکی از مباحث مطرح در حوزه شناسایی الگو (http://fa.wikipedia.org/wiki/%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5_%D8%A7%D9%84%DA%AF% D9%88) است که به عنوان یک طبقه بند بدون نظارت (unsupervised classifier) هم شناخته می شود. وظیفه یک الگوریتم خوشه یابی این است که داده های ورودی را تحلیل کرده و آنها را به تعدادی خوشه تقسیم کند:

http://p30codenevis.ir/images/opencv/K-Means.png

نقاط پراکنده در صفحه دوبعدی به 5 خوشه تقسیم شده اند.
یکی از معروفترین الگوریتمهای خوشه بندی، الگوریتم K میانگین (K-means (http://en.wikipedia.org/wiki/K-means_clustering) یا C-means) است. این الگوریتم تلاش می کند که بر اساس یک معیار فاصله، داده ها را به k خوشه تقسیم کند. معمولا هر خوشه توسط بردار میانگین داده های موجود در آن نمایندگی می شود. در روش k همسایگی، روند کار به طور ساده به این صورت است که ابتدا K بردار تصادفی به عنوان مراکز خوشه های اولیه انتخاب می شوند. این بردارها می توانند از فضای داده های ورودی انتخاب شوند یا مقادیر کاملا تصادفی داشته باشند. سپس هر داده ورودی بر اساس یک معیار فاصله (مثل فاصله اقلیدسی یا city block) با بردارهای میانگین اولیه، به یکی از خوشه ها تخصیص داده می شود. در پایان دوره اول، میانگین خوشه ها بر اساس داده هایی که به هر خوشه تخصیص داده شده است، به روز می شوند و فرایند مقایسه و تخصیص تکرار می شود. این فرایند آنقدر ادامه می یابد که بردارهای میانگین خوشه ها دیگر تغییر نکند. تمام

پیاده سازی این الگوریتم خیلی ساده است و هر برنامه نویس متوسطی می تواند پیاده سازی کند لیکن کتابخانه OpenCV این الگوریتم را دارد و شما می توانید به راحتی از آن استفاده کنید.
کد زیر یک برنامه نمونه با استفاده از OpenCV است که البته در مثالهای خود OpenCV هم مشابه آن یافت می شود. جهت استفاده از ساختار جدید OpenCV تغییراتی در آن اعمال شده که استفاده آن در سایر برنامه ها را آسانتر کند. این برنامه چند خوشه با توزیع های گاوسی مختلف تولید می کند و سپس با الگوریتم kmeans آنها را خوشه یابی می کند و در قالب یک تصویر، نتیجه خوشه بندی را نمایش می دهد:

#ifdef _CH_
#pragma package
#endif

#define CV_NO_BACKWARD_COMPATIBILITY

#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include
#endif

#ifdef _DEBUG
#pragma comment (lib, "highguid.lib")
#pragma comment (lib, "cxcored.lib")
#else
#pragma comment (lib, "highgui.lib")
#pragma comment (lib, "cxcore.lib")
#endif

int main( int argc, char** argv )
{
#define MAX_CLUSTERS 5
CvScalar color_tab[MAX_CLUSTERS];
IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
CvRNG rng = cvRNG(-1);
CvPoint ipt;

color_tab[0] = CV_RGB(255,0,0);
color_tab[1] = CV_RGB(0,255,0);
color_tab[2] = CV_RGB(100,100,255);
color_tab[3] = CV_RGB(255,0,255);
color_tab[4] = CV_RGB(255,255,0);

cvNamedWindow( "clusters", 1 );

for(;;)
{
char key;
int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;
int i, sample_count = cvRandInt(&rng)%1000 + 1;


cv::Mat _points (sample_count, 2, CV_32FC1);
cv::Mat _clusters (sample_count, 1, CV_32SC1);
//cv::RNG& rng = cv::theRNG();
//rng.fill(_points, cv::RNG::NORMAL, param1, param2 );
for(int i = 0; i < sample_count; i++){
CvPoint center;
CvMat point_chunk;
center.x = cvRandInt(&rng)%img->width;
center.y = cvRandInt(&rng)%img->height;
}

CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 );
CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 );
cluster_count = MIN(cluster_count, sample_count);

/* generate random sample from multigaussian distribution */
for( k = 0; k < cluster_count; k++ )
{
CvPoint center;
CvMat point_chunk;
center.x = cvRandInt(&rng)%img->width;
center.y = cvRandInt(&rng)%img->height;
cvGetRows( points, &point_chunk, k*sample_count/cluster_count,
k == cluster_count - 1 ? sample_count :
(k+1)*sample_count/cluster_count, 1 );

cvRandArr( &rng, &point_chunk, CV_RAND_NORMAL,
cvScalar(center.x,center.y,0,0),
cvScalar(img->width*0.1,img->height*0.1,0,0));
}

/* shuffle samples */
for( i = 0; i < sample_count/2; i++ )
{
CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
CvPoint2D32f temp;
CV_SWAP( *pt1, *pt2, temp );
}


for(int i = 0; i < sample_count; i++){
_points.at(i, 0) = points->data.fl[i*2];
_points.at(i, 1) = points->data.fl[i*2+1];
}


//old OpenCV Style
//cvKMeans2( points, cluster_count, clusters,
// cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ),
// 5, 0, 0, 0, 0 );

//New OpenCV Style
cv::kmeans( _points, cluster_count, _clusters,
cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ),
5, 0, 0);

cvZero( img );

for( i = 0; i < sample_count; i++ )
{
//int cluster_idx = clusters->data.i[i];
//ipt.x = (int)points->data.fl[i*2];
//ipt.y = (int)points->data.fl[i*2+1];

int cluster_idx = _clusters.at(i, 0);
ipt.x = (int)_points.at (i, 0);
ipt.y = (int)_points.at (i, 1);

cvCircle( img, ipt, 2, color_tab[cluster_idx], CV_FILLED, CV_AA, 0 );
}

cvReleaseMat( &points );
cvReleaseMat( &clusters );

cvShowImage( "clusters", img );

key = (char) cvWaitKey(0);
if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'
break;
}

cvDestroyWindow( "clusters" );
return 0;
}

#ifdef _EiC
main(1,"kmeans.c");
#endif



منبع (http://p30codenevis.ir/cpp-programming/130-k-means-clustering-in-opencv.html)

soroushp
دوشنبه 05 تیر 1391, 20:10 عصر
من OpenCV-2.1.0-win32-vs2008 نصب کردم و با این لینک (http://www.mojsazan.com/forum/showthread.php?tid=2031)تو visual stdio 2010 مچ کردم اما مشکل زیر رخ میده ، الان باید چه کرد ؟
88732

مصطفی ساتکی
دوشنبه 05 تیر 1391, 23:03 عصر
دوست عزیز یکبار خلاصه توضیح می دم شاید دوستان دیگر هم مایل به استفاده باشند.
شما به 2 صورت می تونید OpenCV رو در اختیار داشته باشید یکی به صورت یک پکیج از قبل کامپایل شده مثل همین موردی که شما استفاده کردید و دیگری هم سورس در اختیار داشته باشید و با استفاده از نرم افزار CMake سورس OpenCV رو برای سیستم عامل و کامپایلر مد نظر تون کامپایل کنید.
روش اول که حرفی توش نیست یک فایل setup مثل هم setup های دیگر فایل رو extract کرده و یک user variable هم برای opencv میسازه اما در روش دوم ابتدا نرم افزار Cmake رو نصب کرده سپس مسیر سورس و مسیری را که بایستی در آن عملیات make صورت بگیره رو هم معرفی کنید بعدش اگر خواستید می تونید options های نصب رو دستکاری کنید به نظر هم پیش فرض رو قبول کنید و بعد هم برای آن کامپایلری که میخاید استفاده کنید.سپس عملیات make رو شروع کنید سپس هم پروژه ها به صورت جدا گانه در اختیار شما قرار می گیره که بر حسب نیاز می تونید هر کدام رو که مایل باشید رو bulid کنید یک پروژه Build All وجود داره که با bulid کردن اون پروژه تمامی lib و dll و exe های مورد نظر براتون ساخته میشه.

حالا در هر 2 صورت بالا OpenCV رو تا اینجا کامپایل شده دارید
توی vs2008 بایستی به گزینه مراجعه کنید
Tools -> Options -> Projects and Solutions -> VC++‎‎ Directories
اینجا بایستی هم در بخش include مسیرهای include و در مسیر lib بایستی مسیر lib مربوط رو اضافه نماید. که اگر فرض رو براین بگیریم که OpenCV رو در داریو c:\ نصب کردید
در قسمت include مسیر زیر رو C:\OpenCV2.1\include\opencv اضافه کنید قابل توجه که در نسخه های 2.1 به بعد که تا امروز 2.4.1 هم منتشر شده شما برای استفاده از کلاس های C++‎‎ بایستی C:\OpenCV2.3\include رو هم اضافه نماید یعنی 2 مسیر C:\OpenCV2.3\include\opencv و C:\OpenCV2.3\include
حالا بیاید تو بخش lib ها و مسیر C:\OpenCV2.1\lib رو هم اضافه نماید اگر مایل به افزودن مسیر سورس ها بوید می تونید آنها رو هم اضافه نماید که همشون تو مسیر C:\OpenCV2.1\src هستش.

توی vs2010 مسیر VC++‎‎ Directoies تغییر کرده که در مسیر Project -> MySamleProject Properties...Configuration Properties -> VC++‎‎ Directories قرار دارد که در آنجا هم مثل vs2008 همان مسیرهایی که توضیح داده شده به کامپایلر اضافه می کنید

بعد از مراحل بالا بردید به قسمت project -> Properties -> Linker ->Input -> Additional Dependencies... در اینجا بایستی lib های موردنظر رو به پروژه اضافه کنید opencv lib های مربوط به debug و release مجزا داره که بسته به کاری که میخاید انجام بدید بایستی lib های مورد نظر رو به پروژتون اضافه کنید.
برای debug builds به صورت cv210d.lib; cxcore210d.lib; highgui210d.lib;'
و برای release builds به صورت cv210.lib; cxcore210.lib; highgui210.lib;
استفاده نمایید.
به این ترتیب همه چیز آماده است تا یک پروژه sample بنویسید.

#include <cv.h>
#include <highgui.h>
main()
{
IplImage* img = cvLoadImage("c:\\image.bmp",0);
cvThreshold(img,img,128,255,CV_THRESH_BINARY);
cvShowImage("View",img);
cvWaitKey(0);
cvReleaseImage(&img);
}


حالا وقتی که میخاید پروژه نوشته شده رو publish کنید بایستی اون lib هایی را که در release mode استفاده کردید معادل همون فایل هایی dll که در مسیر bin مربوط به OpenCV قرار دارند را هم در کنار فایل اجرایی تون قرار بدید.

نکته : اگر بدست آوردن نام lib های براتون مشکله می تونید از روش زیر استفاده کنید.به مسیر lib مربوط به OpenCV رفته و cmd های زیر را اجرا کنید.
Dir *d.lib /b > debugLibs.txt
Dir *0.lib /b > releaseLibs.txt

موفق باشید

soroushp
سه شنبه 06 تیر 1391, 11:01 صبح
من برای نصب از این لینک کمک گرفتم (http://www.mojsazan.com/forum/showthread.php?tid=2031)-چک کنید ببینید کم و کاستی تو این لینک نیست که من انجام نداده باشم ،اون کدی رو که نوشتید هم اجرا کردم اما همچنان سیستم مشکل داره - نظرتون چیه اگر visual stdio 2008 رو نصب کنم ؟
88764

مصطفی ساتکی
سه شنبه 06 تیر 1391, 11:46 صبح
دوست عزیز در پست شماره 17 هم کاملاً توضیح دادم اینجا توضیح دادم که از سایت های دیگر بی نیاز باشید

خطای شما مربوط میشه به این قسمت

بعد از مراحل بالا بردید به قسمت project -> Properties -> Linker ->Input -> Additional Dependencies... در اینجا بایستی lib های موردنظر رو به پروژه اضافه کنید opencv lib های مربوط به debug و release مجزا داره که بسته به کاری که میخاید انجام بدید بایستی lib های مورد نظر رو به پروژتون اضافه کنید.
برای debug builds به صورت cv210d.lib; cxcore210d.lib; highgui210d.lib;'
و برای release builds به صورت cv210.lib; cxcore210.lib; highgui210.lib;

لطفا پست شماره 17 رو کامل بخونید و طبق همان عمل کنید اون لینک هم چیزی غیر از این مطالب گفته شده ذکر نکرده

موفق باشید

soroushp
سه شنبه 06 تیر 1391, 20:56 عصر
بعد از مراحل بالا بردید به قسمت project -> Properties -> Linker ->Input -> Additional Dependencies... در اینجا بایستی lib های موردنظر رو به پروژه اضافه کنید opencv lib های مربوط به debug و release مجزا داره که بسته به کاری که میخاید انجام بدید بایستی lib های مورد نظر رو به پروژتون اضافه کنید.
برای debug builds به صورت cv210d.lib; cxcore210d.lib; highgui210d.lib;'
و برای release builds به صورت cv210.lib; cxcore210.lib; highgui210.lib;

من اینو اضافه می کنم اما پیغام زیر رو میده :
Error 1 error LNK1104: cannot open file 'highgui210.lib'
بعد برای هر پروژه باید این lib رو اضافه کنی ؟

مصطفی ساتکی
سه شنبه 06 تیر 1391, 22:25 عصر
پس مسیر lib مورد نظر را معرفی نکردید ببینید تو Project -> MySamleProject Properties...Configuration Properties -> VC++‎‎‎ در قسمت lib مسیر فولدر lib مربوط به OpenCV را اضافه کردید اگر اینکارو انجام دادید تو این مسیر -Project -> MySamleProject Properties...Configuration Properties -> c/C++‎‎‎ ->General ->additional Include Directories رفته و c:\OpenCV2.1\lib رو مجدد تو این مسیر رو هم اضافه کنید

soroushp
چهارشنبه 07 تیر 1391, 00:56 صبح
من دیگه بیخیال شدم رو visual stdio 2008 درست شد فقط سوالی که داشتم اینه که راهی وجود داره در هر پروژه *.dll های bin رو تو پروژه کپی پیست نکنیم ؟