رفتن به نوشته‌ها

ماه: اکتبر 2015

استفاده از کتابخانه OpenCV در Qt

داشتم این مطلب رو بصورت جدا برای خودم مینوشتم که دستورات رو فراموش نکنم، گفتم چه خوبه که بصورت عمومی منتشرش کنم، شاید گره ای از کار کسی باز کرد. البته همچنان نوشتن ادامه Ncurses و Shell Script در دستوره کاره !
قبلا کتابخانه OpenCV را معرفی کرده بودم، خیلی ها علاقمندند از کتابخانه‌های Qt و OpenCV بصورت توامان استفاده کنند، که با اعمال تغییرات ساده ای در فایل pro. در پروژه ای که می‌سازیم میتوانیم OpenCV را به Qt بشناسانیم!
برای ایجاد یک پروژه جدید در Qt بصورت زیر عمل می‌کنیم :
از منوی فایل گزینه New Project را می‌زنیم و سپس Qt Widgets Application را انتخاب می‌کنیم و بقیه موارد را به صورت پیش فرض رها می‌کنیم.
با استفاده از دستور

pkg-config --cflags opencv

آدرس هدر فایل های کتابخانه را بدست می‌آوریم . احتمالا چیزی شبیه به این خواهد بود :

-I/usr/include/opencv

در فایل pro. در پروژه برنامه ما، دستور زیر را وارد می‌کنیم:

INCLUDEPATH += /usr/include/opencv

توجه کنید که قسمت سمت راست دستور بالا از pkg-config -‌-cflags opencv بدست می‌آید ( البته بدون کاراکتر I در ابتدای مسیر )
یک بار دیگر از ترمینال استفاده کرده و آدرس کتابخانه‌های OpenCV را بدست می‌آوریم:

pkg-config --libs opencv

که احتمالا چیزی شبیه به

-L/lib64 -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -ltbb -lGL -lGLU -lrt -lpthread -lm -ldl

خواهد بود.
در فایل pro. در یک خط جدید دستور زیر را وارد می‌کنیم:

LIBS += -L/lib64 -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -ltbb -lGL -lGLU -lrt -lpthread -lm -ldl

البته با توجه به پروژه خود تنها کتابخانه‌های مورد نیاز خود را اضافه می‌کنیم.
در انتها برای آزمایش کارکرد صحیح یک برنامه ساده بصورت زیر در فایل mainwindow.cpp می‌نویسیم:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->;setupUi(this);
    cv::Mat inputImage = cv::imread("/home/ali/Picture/lfs-puzzle.jpg");
    cv::imshow("Display Image", inputImage);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

بدیهیست آدرس عکس مورد نظر برای نمایش باید آدرس معتبری باشد .

این ترجمه آزادی بود از نوشته Rodrigo Berriel در این باره .

خارج شدن از نظر

text base user interface در لینوکس

مدتها این موضوع معلق بود تا اینکه فرصت کنم و تکمیلش کنم . تصمیم گرفتم کمی درباره ساخت یک UI بر مبنای text صحبت کنم . چیزی که همه ما از ابتدای برخوردمون با کامپیوتر باهاش درگیر هستیم، اما کاملا بی توجه از کنارش عبور می‌کنیم . در دسترس ترین مثال برای این موضوع، UI مربوط به Bios کامپیوتر ماست .یک UI گرافیکی مبتنی بر متن شامل انواع منوها و متون و صفحات مختلف.
کتابخانه مورد استفاده برای نوشتن یک UI مبتنی بر متن NCurses نام دارد. قصدم معرفی مقدماتی این کتابخانه است، شاید خیلی از دوستان بپرسند چرا Qt نه؟! Qt هم جذابیت بصری بیشتری داشته و هم احتمالا سرعت بیشتری در پیاده سازی ها برای برنامه نویس به ارمغان می‌آورد، من هم منکر این مزیتهای Qt نیستم، اما حجم کتابخانه NCurses نسبت به Qt قابل مقایسه نیست و اینکه من قصدم تکرار مکررات نیست، بلکه پرداختن و معرفی قسمتهایی که در جامعه آی‌تی کمتر بهشون پرداخته شده و معمولا ناشناخته هستند، جزء اهداف من بوده و هست . درباره Qt مطالب خیلی زیادی وجود دارد اما درباره NCurses مطلب زیادی به فارسی نداریم.
نصب کتابخانه NCurses
برای نصب Ncurses در توزیع اوبونتو از دستور

sudo apt-get update
sudo apt-get install ncurses-dev

همچنین فایل سورس در آدرس GNU Operating System موجود است ، میتوان بعد از دانلود مثل تمامی برنامه‌های لینوکسی اقدام به نصب نمود.

tar zxvf ncurses<version>.tar.gz  # unzip and untar the archive
cd ncurses<version>               # cd to the directory
./configure                             # configure the build according to your 
                                        # environment
make                                    # make it
su root                                 # become root
make install                            # install it

کامپایل کردن برنامه‌های شامل کتابخانه ncurses توسط gcc
برای کامپایل یک برنامه نوشته شده در لینوکس از gcc بصورت زیر استفاده می‌کنیم:

gcc -o exe_name program_name.c

که exe_name نام دلخواه ما برای فایل اجرایی و program_name.c نام فایل سورس ما به زبان c است.
در صورتیکه بجز کتابخانه‌های استاندارد موجود به همراه gcc از کتابخانه‌ای که به صورت دستی نصب کرده‌ایم استفاده کنیم، در انتهای دستور فوق باید نام کتابخانه مورد استفاده با پیشوند l- هم نوشته شود، در مثال ما دستور فوق بصورت زیر اصلاح میشود:

gcc -o exe_name program_name.c -lncurses

برای آموزش از Trace کردن برنامه‌های ساده شروع میکنیم:

#include <ncurses.h>
 
int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");    /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */
 
    return 0;
}

برنامه فوق عبارت !!!Hello World را در یک صفحه جدید نمایش میدهد.
تابع ()initscr ترمینال را جهت استفاده ncurses آماده سازی می‌کند. در بعضی پیاده سازی‌ها این آماده سازی شامل ایجاد یک صفحه خالی ترمینال وتخصیص فضای مورد نیاز در حافظه سیستم برای این پنجره می‌شود. برای هرگونه تغییر، ابتدا باید تابع ()initscr فراخوانی شود تا بتوانیم تغییرات مدنظر خود را در صفحه ( این صفحه stdscr نامیده می‌شود) اعمال کنیم.
تابع ()printw همانند تابع معروف ()print عمل میکند بجز اینکه خروجی آن در صفحه stdscr ، در مختصات دلخواه (x,y) چاپ می‌شود.
تابع ()refresh ،عملکرد جالبی را ارائه می‌دهد. تابع printw تعداد زیادی flag را تنظیم کرده و محتویات مورد نظر ما را در بافر خود می‌نویسد. اما بدون استفاده از تابع ()refresh این نوشته ها در صفحه stdscr چاپ نمی‌شوند . برای چاپ باید حتما یکبار تابع ()refresh فراخوانی شود.
این کار باعث بهبود عملکرد و انعطاف پذیری بیشتر برنامه خواهد شد، به این صورت که هر برنامه ممکن است تعداد زیادی آپدیت برای نمایش در صفحه نمایش داشته باشد که همگی در بافر تجمیع شده و با هر بار اجرای تابع ()refresh صفحه نمایش به روزرسانی خواهد شد.
در انتها با فراخوانی تابع ()endwin به کار در مد curses پایان می‌دهیم. به این صورت که ترمینال به صورت عادی برخواهد گشت و فضاهای حافظه گرفته شده آزاد می‌شود.این تابع بعد از اتمام کار در مد curses فراخوانی می‌شود.
ادامه دارد … .
این مطلب ترجمه آزادی از این نوشته در سایت tldp.org بود .

خارج شدن از نظر