# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > پردازش تصویر (Image Processing) >  آموزش OpenCV

## amin1softco

دوستان من زیاد با بینایی ماشین کار نکردم ولی اگر کسی باشه دوست دارم آموزش OpenCV رو در این تاپیک  ادامه بده چون خیلی بهش علاقمند شدم. :لبخند گشاده!:  خودم دست و پا شکسته مطلب پیدا کنم اینجا قرار می دم.

----------


## مصطفی ساتکی

دوست عزیز opencv یک کتابخانه است و wiki آن آنقدر تکمیله که نیازی به آموزش مجدد نداره همچنین چت IRC هم وجود داره #opencv  هستش اگر سوالی دارید مطرح کنید پاسخ داده میشه.
این کتابخانه حدود 500 تابع داره و نسخه های اولیه تحت ansi C در intel پیاده سازی شده نسحه های جدید اون تحت C++‎‎‎ هستش و از کتابخانه Boosting هم استفاده میشه و در پلت فرم های win و linux و mac و android  قابل استفاده هستش و تو اکثر debuger ها قابل استفاده است wrapper های مختلفی هم به برای زبان های مثل C#‎‎‎ و جاوا و غیره طراحی شده .
مهم ترین کار تو پردازش تصویر دونستن اسامی توابع نیست بلکه یادگیری پردازش تصویر ، بینایی ماشین ، تشخیص الگو مطرحه .مثلاً بعضی افراد می بینم نمونه کد ها موجود در کتابخانه رو اجرا می کنند خیلی بهشون خوش میگذره .سوال من اینه آیا کسی که علمی با مقوله برخورد نکنه می تونه پروژه های کاربردی run کنه.
به هر حال پیشنهاد میدم یادگیری تون رو ، روی اون 3 فیلدی که ذکر کردم متمرکز کنید و سوالاتون مطرح کنید نیاز باشه کد ها رو هم با opencv اینجا قرار می دیم.
تو این سایت هم می تونید مطالب مفیدی در مورد OpenCV یاد بگیرید.

----------


## amin1softco

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

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

----------


## sara90

با سلام خیلی خوشحالم که این تالار درست شده منم با نظرamin1softcoعزیز موافقم و دوست دارم به این شیوه که یه پروژه مثال زده بشه وآموزش داده بشه ازاساتید گرامی ممنون میشم یکی شروع کنه این کار رو با تشکر.

----------


## h0x00i

خوب بهتر نیست بجای بحث های انحرافی شروع کنیم ؟

----------


## black_wear

سلام
اینا رو ببینید بد نیست:
آموزش قدم به قدم opencv
منابع یادگیری OpenCV 
و...

----------


## rayson

دوست عزیز این لینک که قرار دادی برای محیط ubuntu  هم میشه ازش استفاده کرد؟

----------


## black_wear

اینا لینکهایه آموزشی هستند، 
اما در کل opencv در لینوکس هم جواب میده

----------


## kamakama

سلام 
ميشه در مورد رپرهاي opencv بيشتر توضيح بدين.
مثلا اين كه مفهوم رپر چيه ؟آيا همه امكانات open cv رو دارن؟انواع رپر ها؟
آيا رپر Emgucv براي كار در سي شارپ بهترين گزينست؟

----------


## amin1softco

*شروع کار با OpenCV*

برای شروع کار با OpenCV ابتدا باید، کتابخانه آن را دریافت  کرده و نصب کنید. برای دریافت OpenCV روی لینک زیر کلیک کنید و آخرین نسخه  را دانلود کنید:
دانلود نسخه 2.1 OpenCV
 پس از نصب کتابخانه، باید مسیر فایلهای آن را در ویژوال استودیو اضافه کنید. مثلا اگر آن را در مسیر 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

منبع

----------


## amin1softco

*پردازش تصویر به کمک 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 استفاده می شود. جزئیات بیشتر  را از اینجا بخوانید.
 سایر کدهای برنامه برای نمایش و ذخیره سازی تصاویر و پاکسازی حافظه است که گمان نمی کنم نیاز به توضیح داشته باشد.
 تصاویر خروجی برنامه:
 تصویر ورودی: camera-man.jpg

 تصویر خاکستری (کانال سبز): Green channel.jpg

 تصویر لبه کنی: Canny Edge.jpg

 تصویر لبه سوبل: Sobel Edge.jpg

 تصویر کوچک شده: Resized.jpg
منبع

----------


## مصطفی ساتکی

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

----------


## amin1softco

به هر حال این یک کد برای تست و آموزش است نه برای یک پروژه تجاری ولی در کل درسته باید روی پرفرمانس خیلی کار بشه که قبول دارم دوست خوبم یک لینک معرفی کرد که به نظرم جالب بود گفتم اینجا قرار بدم بقیه هم استفاده کنند :
http://faculties.sbu.ac.ir/~a_mansouri/DIP.htm
با تشکر از soroushp

----------


## مصطفی ساتکی

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


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

----------


## amin1softco

*خوشه یابی با الگوریتم K میانگین در OpenCV*
خوشه یابی یکی از مباحث مطرح در حوزه شناسایی الگو  است که به عنوان یک طبقه بند بدون نظارت (unsupervised classifier) هم  شناخته می شود. وظیفه یک الگوریتم خوشه یابی این است که داده های ورودی را  تحلیل کرده و آنها را به تعدادی خوشه تقسیم کند:
 نقاط پراکنده در صفحه دوبعدی به 5 خوشه تقسیم شده اند.    یکی از معروفترین الگوریتمهای خوشه بندی، الگوریتم K میانگین (K-means  یا 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
 
 

منبع

----------


## soroushp

من OpenCV-2.1.0-win32-vs2008 نصب کردم و با این لینک تو *visual stdio 2010* مچ کردم اما مشکل زیر رخ میده ، الان باید چه کرد ؟

----------


## مصطفی ساتکی

دوست عزیز یکبار خلاصه توضیح می دم شاید دوستان دیگر هم مایل به استفاده باشند.
شما به 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

من برای نصب از این لینک کمک گرفتم -چک کنید ببینید کم و کاستی تو این لینک نیست که من انجام نداده باشم ،اون کدی رو که نوشتید هم اجرا کردم اما همچنان سیستم مشکل داره - نظرتون چیه اگر visual stdio 2008 رو نصب کنم ؟

----------


## مصطفی ساتکی

دوست عزیز در پست شماره 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

> بعد از مراحل بالا بردید به قسمت 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 رو اضافه کنی ؟

----------


## مصطفی ساتکی

پس مسیر 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

من دیگه بیخیال شدم رو visual stdio 2008 درست شد فقط سوالی که داشتم اینه که راهی وجود داره در هر پروژه *.dll های bin رو تو پروژه کپی پیست نکنیم ؟

----------

