نصب opencv در Qt 5.4

نصب opencv در Qt 5.4Reviewed by آرمین نصیری پرتوی on Feb 4Rating: 5.0نصب opencv در Qt 5.4ر این قسمت می خواهم طریقه ی لینک کردن کتابخانه opencv رو به Qt 5.4 آموزش بدهم و سپس یک پروژه ساده رو با هم اجرا کنیم

با سلام خدمت کاربران سایت در این قسمت می خواهم طریقه ی لینک کردن کتابخانه opencv  رو به Qt 5.4 آموزش بدهم و سپس یک پروژه ساده رو با هم اجرا کنیم پس با من همراه باشید 

اول از همه باید Qt 5.4  رو یا هر نسخه از ورژن ۵ رو روی ویندوز خودتون نصب کنید

بعد از این که کیوت رو همونطور که قبلا آموزش دادم نصب کردید باید کتابخانه ی opencv رو از این لینک دانلود کنید

  • این آموزش بر اساس opencv 2.4.10 می باشد

بعد اون رو در مسیری داخل درایو c نصب می کنیم  به عنوان مثال  C:Qt\opencv

  • به این نکته توجه کنید که مسیر هایی که در کیوت استفاده می شود باید فاقد کارکتر space باشند

پس از نصب ۲ فایل با نام های opencv و opencv_bin در ان مسیر ایجاد می شود

حالا برنامه ی C Make 3.1 رو ازاین  لینک دانلود کنید و نصب کنید  سپس وارد system می شویم

1

 

و سپس advanced system setting

2

حالا به روی enviroments variables کلیک می کنیم

3

در بخش system variables روی path کلیک کرده و edit را انتخاب می کنیم

4

در اینجا باید مسیر های زیر را اضافه کنیم

C:\Program Files (x86)\CMake\bin

;C:\Qt\Qt5.4.0\Tools\mingw491_32\bin

;C:\Qt\opencv\opencv_bin\bin

;C:\Qt\Qt5.4.0\Tools\QtCreator\bin

 

حال وارد برنامه ی C Make می شویم

5

از لیست بالا گزینهی دوم رو انتخاب می کنیم

 

6

یرای source مسیر C:/Qt/opencv/opencv/sources

و برای  binaries مسیر C:/Qt/opencv/opencv_bin

رو انتخاب کنید و سپس بر روی configure  کلیک کنید

7

حالا گزینه های MinGW Make files و specify native compiler رو انتخاب کنید

8

در این مرحله برای C مسیر     C:/Qt/Qt5.4.0/Tools/mingw491_32/bin/gcc.exe

و برای ++C مسیر     C:/Qt/Qt5.4.0/Tools/mingw491_32/bin/g++.exe

رو انتخاب کنید با انجام این مراحل لیستی قرمز رنگ ایجاد می شود که در اون باید مراحل زیر رو انجام بدین

  • WITH_QT, WITH_TBB, WITH_IPP, WITH_CUDA, CMAKE_BUILD_TYPE ,WITH_QT باید تیک زده شده باشند
  • WITH_TBB, WITH_IPP, WITH_CUDA باید تیک نداشته باشند
  • در مقابل CMAKE_BUILD_TYPE باید نوشته شود Debug

چون C Make برای نسخه ی۴ کیوت می باشد از این به بعد باید چند مرحله را دستی وارد کنیم

  • در مقابل QT_QMAKE_EXECUTABLE بمی نویسیم    C:/Qt/Qt5.4.0/5.4/mingw491_32/bin/qmake.exe
  • در مقابل Qt5Concurrent_DIR می نویسیم     C:/Qt/Qt5.4.0/5.4/mingw491_32/lib/cmake/Qt5Concurrent
  • در مقابل QT5Core_DIR می نویسیم    C:/Qt/Qt5.4.0/5.4/mingw491_32/lib/cmake/Qt5Core
  • در مقابل QT5Gui_DIR می نویسیم     C:/Qt/Qt5.4.0/5.4/mingw491_32/lib/cmake/Qt5Gui
  • در مقابل QT5Test_DIR می نویسیم      C:/Qt/Qt5.4.0/5.4/mingw491_32/lib/cmake/Qt5Test
  • در مقابل QT5Widgets_DIR می نویسیم     C:/Qt/Qt5.4.0/5.4/mingw491_32/lib/cmake/Qt5Widgets
  • حالا روی Generate کلیک می کنیم تا از ما مسیر QT5OpenGL_DIR را بخواهد و در روبه روی آن می نویسیم    C:/Qt/Qt5.4.0/5.4/mingw491_32/lib/cmake/Qt5OpenGL

بعد از انجام مراحل بالا تا زمانی که تمام خطوط قرمز از بین بروند روی Configure کلیک می کنیم و سپس روی Generate کلیک می کنیم

پس از اتمام مراحل بالا وارد command prompt می شویم و با دستور cd وارد فایل opencv_bin می شویم و سپس دستور mingw32-make را تایپ کرده و بر روی اینتر کلیک می کنیم

پس از پایان نصب  دستور    mingw32-make install را وارد می کنیم و بعد از پایان ان console را می بندیم

 

با اتمام مراحل نصب وارد Qt creator می شویم و یک پروژه در آن ایجاد می کنیم (روش ایجاد پروزه قبلا اموزش داده شده )

در پروژه وارد بخش pro. می شویم و سپس کد زیر را در آن جایگزین کد موجود می کنیم

و سپس بر روی build  کلیک می کنیم

9

سپس وارد main. cpp شده و کد زیر را در ان می نویسیم

باید توجه کنید که در مقابل دستور cv::imread باید مسیر یک عکس را قرار دهید

حالا بر نامه رو اجرا می کنیم

10

برنامه به صورت بالا اجرا میشه

امیدوارم این اموزش براتون مفید بوده باشه

 

    پاسخگو
    حسین در سه شنبه ۱۴ مهر ۱۳۹۴ :

    سلام خیلی ممنون از آموزش قدم به قدم
    این آموزش با ورژن ۳ opencv هم کار میکنه ؟
    اگه prebuilt دانلود کرده باشیم opencv رو اونوقت چیکار باید کرد ؟
    خیلی خوب میشد اگه این مسائل رو هم در قالب نکته به این پست اضافه میکردید .

      پاسخگو
      آرمین نصیری پرتوی در جمعه ۱۷ مهر ۱۳۹۴ :

      سلام دوست عزیزو مرسی از نظرت
      توصیه می کنم تا زمانی که به ورژن ۳ نیاز نداری نصبش نکن مگر اینکه ویزگی های جدیدی که به اون اضافه شده رو نیاز داشته باشی .
      و نصبش کاملا مشایه نیست چون کتابخانه هایی که در .pro اضافه میشه متفاوت خواهد بود
      از اونجایی که در کیوت ۵ باید یک سری دایرکتوری هم اضافه بشه بهتره که از prebuilt استفاده نکنید چون ممکنه با مشکل مواجه بشید .
      و اگر همین دستورالعمل هایی که گفتم رو به ترتیب اجرا کنی بدون مشکل اجرا میشه
      موفق باشی 🙂

    پاسخگو
    محسن در یکشنبه ۱۹ مهر ۱۳۹۴ :

    سلام من همه مراحل کامل طی کردم اما بعد از اجرا برنامه در qt با خطا has stoped working
    مواجه میشوم و در دیباگر هم gdb exit میشود
    لطفا راهنمایی کنید مشکل از کجاست…

      پاسخگو
      آرمین نصیری پرتوی در یکشنبه ۱۹ مهر ۱۳۹۴ :

      دوست عزیز یکم بیشتر توضیح بدین برنامه از کار میوفته یا Qt creator ؟ متن دقیق ارور رو هم بگین

    پاسخگو
    محسن در دوشنبه ۲۰ مهر ۱۳۹۴ :

    با تشکر از پاسخگو بودن شما
    برنامه از کار میافتند و توی دیباگر چیزی مبنی بر اشکال و خطا دیده نمیشود خودم دلیل منطقی پیدا نمیکنم…
    این هم عکس از خطا رخ داده:
    http://s6.uplod.ir/i/00689/77pqzcne1wki.jpg

      پاسخگو
      آرمین نصیری پرتوی در دوشنبه ۲۰ مهر ۱۳۹۴ :

      در صورت امکان عکس کد هاتون رو بفرستین همچنین .pro تا بررسی کنم

    پاسخگو
    محسن در دوشنبه ۲۰ مهر ۱۳۹۴ :

    کد بخش main.cpp:
    http://s6.uplod.ir/i/00689/esf9b4sgjg7r.jpg
    کد بخش .pro:
    http://s6.uplod.ir/i/00689/5o8uqbc20bnj.jpg

      پاسخگو
      آرمین نصیری پرتوی در چهارشنبه ۲۲ مهر ۱۳۹۴ :


      #include
      #include "opencv2/core/core.hpp"
      #include "opencv2/highgui/highgui.hpp"
      #include "opencv/cv.h"

      using namespace std;

      int main() {
      //another saving camera
      CvCapture *capture = cvCaptureFromCAM( 0 );

      int width = ( int )cvGetCaptureProperty( capture,
      CV_CAP_PROP_FRAME_WIDTH );

      int height = ( int )cvGetCaptureProperty( capture,
      CV_CAP_PROP_FRAME_HEIGHT );
      CvVideoWriter *writer = cvCreateVideoWriter("CamCapture.avi",
      -۱,۳, cvSize( width, height ) );

      cvNamedWindow("capWindow", CV_WINDOW_AUTOSIZE);
      IplImage *frame = 0;

      // this returns 0 not sure why ??
      //double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
      // fps ke estefade mishavad kondi va tondi film zabt shode ra neshan midahad
      double fps = 30;

      while( 1 )
      {
      frame = cvQueryFrame( capture );
      cvShowImage("capWindow",frame);
      cvWriteFrame( writer, frame );
      char c = cvWaitKey(1000/fps);

      if( c == 27 ) break;
      }

      cvReleaseCapture( &capture );
      cvReleaseVideoWriter( &writer );
      cvDestroyWindow( "capWindow" );

      }

      این کد رو امتحان کنید

    پاسخگو
    فاطمه بخشی در سه شنبه ۲۱ مهر ۱۳۹۴ :

    سلام
    من یک مبتدی در opencv هستم و به تازگی دارم شروع به فراگیریش با QT میکنم
    اما به تازگی به یک مشکل بر خوردم که خیلی برایم مبهم است خروجی دریافت نمیکنم و فریم بریک میشود اما وبکم فعال میشود و بعد یک مدت قطع میشود و فریم خالی بریک میشود دلیلشو نمیدانم چرا فریم خالی است در صورتی که همه مراحل درست است؟!
    اینم کد main:
    #include

    using namespace cv;

    int main()
    {
    Mat frame;
    namedWindow(“video”, 1);
    VideoCapture cap(0);
    while ( cap.isOpened() )
    {
    cap >> frame;
    if(frame.empty()) break;

    imshow(“video”, frame);
    if(waitKey(30) >= 0) break;
    }

    return 0;
    }
    و کد pro:
    INCLUDEPATH += C:\\OpenCV243\\release\\include
    LIBS += -LC:\\OpenCV243\\release\\lib \
    -lopencv_core243.dll \
    -lopencv_highgui243.dll

    روی وبکم های دیگه و حتی دوربین آی پی تست کردم اما جواب یکسانه fram.empty بریک میکند اگر هم حذفش کنیم که بریک نکنه میدانید opencv خطا ایجاد میکند مبنی بر :
    assertian failed….

    میدانم جا مناسبی برای سوال نیست اما خیلی درگیرش بودم یک پروژه دانشگاهی است و باید تحویل دهم لطفا جناب پرتوی کمک بفرمایید…

      پاسخگو
      آرمین نصیری پرتوی در سه شنبه ۲۱ مهر ۱۳۹۴ :

      کد زیر رو امتحان کنید

      #include
      #include "opencv2/core/core.hpp"
      #include "opencv2/highgui/highgui.hpp"
      #include "opencv/cv.h"

      using namespace std;

      int main() {
      //another saving camera
      CvCapture *capture = cvCaptureFromCAM( 0 );

      int width = ( int )cvGetCaptureProperty( capture,
      CV_CAP_PROP_FRAME_WIDTH );

      int height = ( int )cvGetCaptureProperty( capture,
      CV_CAP_PROP_FRAME_HEIGHT );
      CvVideoWriter *writer = cvCreateVideoWriter("CamCapture.avi",
      -۱,۳, cvSize( width, height ) );

      cvNamedWindow("capWindow", CV_WINDOW_AUTOSIZE);
      IplImage *frame = 0;

      // this returns 0 not sure why ??
      //double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
      // fps ke estefade mishavad kondi va tondi film zabt shode ra neshan midahad
      double fps = 30;

      while( 1 )
      {
      frame = cvQueryFrame( capture );
      cvShowImage("capWindow",frame);
      cvWriteFrame( writer, frame );
      char c = cvWaitKey(1000/fps);

      if( c == 27 ) break;
      }

      cvReleaseCapture( &capture );
      cvReleaseVideoWriter( &writer );
      cvDestroyWindow( "capWindow" );

      }

      این کد اجرا میشه
      اگر اجرا شد یعنی کدی که نوشتین غلطه

    پاسخگو
    فاطمه بخشی در سه شنبه ۲۱ مهر ۱۳۹۴ :

    سلام ممنون از پاسخگوییان
    بله با این کد از وبکم خروجی میگیرم اما این روش برای دوربین آی پی استفاده نمیشه کرد اگر کدی دارید که بتونم به یک دوربین آی پی با استاندارد mjpeg وصل شم عالی میشود
    فقط یک سوال میشه این کد طوری پیدا کرد که مثل کد من فریم فریم در یک متغییر ذخیره کرد
    در اصل هدف پروژه من traking ball yellow توسط یک دوربین آی پی است کد های زیادی تو نت پیدا کردم اما همشون از شیوه بالا برای پردازش فریم ها استفاده کرده اند نمیشه کد بالا من اصلاح کنید چرا در کد من نمیشه خروجی تصویر گرفت

    باز هم سپاسگذارم برای وقت گذاشتن جناب عالی بر روی نظرات …

      پاسخگو
      آرمین نصیری پرتوی در چهارشنبه ۲۲ مهر ۱۳۹۴ :

      لیست منابعی که دارید و از اون ها مطالعه می کنید رو بدین تا اون هایی رو که ندارید براتون ارسال کنم

      پاسخگو
      آرمین نصیری پرتوی در چهارشنبه ۲۲ مهر ۱۳۹۴ :

      این ۲ تا کد رو هم امتحان کنید

      #include
      #include
      #include
      #include
      #include

      using namespace std;
      using namespace cv;

      int main()
      {
      Mat frame;
      namedWindow("video", 1);
      VideoCapture cap("http://IPADDRESS/video.mjpg");
      if(!cap.isOpened())
      {
      cout<<"Camera not found"<> frame;
      if(frame.empty()) break;

      imshow("video", frame);
      if(waitKey(30) >= 0) break;
      }
      return 0;
      }

      و


      #include
      #include
      #include
      #include

      using namespace cv;
      using namespace std;

      int main(int argc, char* argv[])
      {
      VideoCapture cap; //

      cap.open("http://192.168.226.101:8080/video?x.mjpeg");
      if (!cap.isOpened()) // if not success, exit program
      {
      cout << "Cannot open the video cam" << endl;
      return -1;
      }

      double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
      double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video

      cout << "Frame size : " << dWidth << " x " << dHeight << endl;

      namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
      namedWindow("MyNegativeVideo",CV_WINDOW_AUTOSIZE);

      while (1)
      {
      Mat frame;
      Mat contours;

      bool bSuccess = cap.read(frame); // read a new frame from video

      if (!bSuccess) //if not success, break loop
      {
      cout << "Cannot read a frame from video stream" << endl;
      break;
      }

      flip(frame, frame, 1);
      imshow("MyVideo", frame); //show the frame in "MyVideo" window

      Canny(frame, contours, 500, 1000, 5, true);
      imshow("MyNegativeVideo", contours);

      if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
      {
      cout << "esc key is pressed by user" << endl;
      break;
      }
      }
      return 0;
      }

    پاسخگو
    فاطمه بخشی در چهارشنبه ۲۲ مهر ۱۳۹۴ :

    سلام و مجدد سپاس برای پاسخگوییتان
    نه متاسفانه این کدها را من قبلا تست کرده بودم جواب نمیدهد این تابع بریک میشود
    !cap.isOpened
    البته من با لینک مستقیم در مرورگر http به ویدیو دوربین با کدک mjpeg دسترسی دارم و مشکلی در اتصال و ارتباط نیست و مشکل از برنامه QT است
    کلا QT من با توابع cap و VideoCapture مشکل دارد…

    پاسخگو
    افشین در یکشنبه ۲۹ فروردین ۱۳۹۵ :

    سلام و تشکر…
    راستش من اصلا اشنایی ندارم و وقتی میخوام به qt متصل کنم opencv رو بامشکل رو به رو میشم.
    اول با opencv 3.1 امتحان کردم ولی اونجا که فرمودید پوشه opencv_bin رو انتخاب کنم، دیدم این پوشه وجود نداره.
    بعد نسخه ۲٫۴٫۱۰ رو دان کردم و بعد از اکسترکت باز هم opencv_bin رو ندارم.
    باید چ کنم؟