OpenCV рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕реЗрд╡рд╛ рдкрд░ Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо Qt рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝, рдпрд╛ Qaleabel рдкрд░ IplImage рдШрд╕реАрдЯрдирд╛

рдкрд░рд┐рдЪрдп


OpenCV рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ Qt рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рддрд░рд╣, рдореБрдЭреЗ Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬрд╝реБрдЕрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереАред
рдиреЗрдЯ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рддреЛрдбрд╝реЛ, рджреЗрдЦрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЗрдЦ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рдФрд░ "рд╣рд╛рдЗрд▓рд╛рдЗрдЯ" рдвреВрдВрдврдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреВрдЯреА рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдУрдкрдирд╕реАрд╡реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рдордп рдФрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рд╡рд┐рдВрдбреЛрдЬ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд░рд╛рдб рдбреЗрд▓реНрдлреА рдореЗрдВ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред

рдЯрд┐рдкреНрдкрдгреА



рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди

рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрдирд╕реАрд╡реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдХреЛрдб рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╣реИред
рд╢рд╛рдпрдж рдЕрдм рдореИрдВ рдЬреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рд╡рд╣ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЗ рд╕рдорд╛рди рдкреНрд▓рдЧ-рдЗрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдЦреБрд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ Qt Designera рдкреНрд▓рдЧ-рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ "рдЦреАрдВрдЪреЗрдВ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЬрд╛рд╣рд┐рд░ рд╣реИ, Qt Dessigner рдкреИрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдШрдЯрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ "рдлрдВрд╕рд╛рдпрд╛" рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдбрд┐рдЬрд╛рдЗрдирд░ рдореЗрдВ рдПрдХ рд╕рд░рд▓ QLabel рдШрдЯрдХ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкрд┐рдХреНрд╕рдореИрдк рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫрд╡рд┐ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рдирд╛ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреА рдУрд░ рдореБрдбрд╝рдирд╛
рдФрд░ рдХреНрдпреВрдЯреА рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрд░реЛрдд ред рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдХрд╕реНрдЯрдо рдкреНрд▓рдЧрдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ! рдЕрдм рд╣рдо рдЧрдВрддрд╡реНрдп рдкрде рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ: $ $ qtdir / plugin / рдбрд┐рдЬрд╝рд╛рдЗрдирд░
рдЖрдЗрдП рдирдП рдШрдЯрдХ рдХреЗ рдЖрд╡рд░рдг рдХреЛ рдПрдХ рддрд░рдл рдЫреЛрдбрд╝ рджреЗрдВред рд╣рдо рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдШрдЯрдХ рд╕реЗ рд╕реАрдзреЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдирдП рд╡рд┐рдЬреЗрдЯ рдХреЗ CQtOpenCVImage рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рднрд░реА рд╣реБрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдПрдВред
рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓ cqtopencvimage.h

#ifndef QTOPENCVIMAGE_H #define QTOPENCVIMAGE_H 

#include <QtDesigner / QDesignerExportWidget>

 #include <QWidget> #include <QUrl> #include <QLabel> #include "opencv2/opencv.hpp" #include <QScopedPointer> /*----------------------------------------------------------------------------*/ 

рд╡рд░реНрдЧ CQtOpenCVImagePStreet;
 /*----------------------------------------------------------------------------*/ class #if defined(QDESIGNER_EXPORT_WIDGETS) QDESIGNER_WIDGET_EXPORT #else Q_DECL_EXPORT #endif 
CQtOpenCVImage
  : public QWidget { Q_OBJECT Q_PROPERTY(QUrl capture READ getCapture WRITE slot_setCapture) Q_PROPERTY(QString text READ getLabelText WRITE slot_setLabelText) Q_PROPERTY(QPixmap pixmap READ getPixmap WRITE slot_setPixmap) Q_PROPERTY(bool scaledContents READ hasScaledContents WRITE slot_setScaledContents) Q_PROPERTY(bool grayscale READ isGrayscale WRITE slot_setGrayscale) Q_PROPERTY(Qt::Alignment alignment READ getAlignment WRITE setAlignment) public: explicit CQtOpenCVImage(QWidget* parent = 0, Qt::WindowFlags f = 0); virtual ~CQtOpenCVImage(); QUrl& getCapture (); QString getLabelText () const; const QPixmap* getPixmap () const; const QImage* getImage () const; Qt::Alignment getAlignment() const; void setAlignment(Qt::Alignment); const QLabel* getQLabel () const; bool hasScaledContents() const; bool isGrayscale() const; public Q_SLOTS: void slot_setCapture ( const QUrl& ); void slot_setLabelText ( const QString& ); void slot_setPixmap ( const QPixmap& ); void slot_setImage ( const QImage& ); void slot_setQLabel ( const QLabel& ); void slot_setGrayscale(bool); void slot_setScaledContents(bool); Q_SIGNALS: void signal_Grayscale(bool); void signal_ImageChanged(); void signal_CaptureChanged(); void signal_PixmapChanged(); void signal_LabelChanged(); void signal_AlignmentChanged(); private: Q_DISABLE_COPY(CQtOpenCVImage) Q_DECLARE_PRIVATE(CQtOpenCVImage) 

QScopedPointer d_ptr;

 }; /*----------------------------------------------------------------------------*/ #endif // QTOPENCVIMAGE_H 


рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝реЙрдиреНрдЯ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ ред

рд╣рдорд╛рд░реА CQtOpenCVImage рдХреНрд▓рд╛рд╕ рджреГрд╢реНрдп рдЫрд╡рд┐ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдЧреБрдг (Q_PROPERTY) рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рд╕рдВрдкрддреНрддрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╢реВрдиреНрдп рд╕реНрд▓реЙрдЯ _ **** (***) рд╕реНрд▓реЙрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рджреГрд╢реНрдп рдбрд┐рдЬрд╛рдЗрди рдХреЗ рджреМрд░рд╛рди QWidget рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╡реЗрдм (IP) рдХреИрдорд░рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рджреЗрддрд╛ рд╣реИ:


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ: рдирд╛рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИред

рдЪрд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб (рдлрд╝рд╛рдЗрд▓ cqtopencvimage.cpp ) рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ ред

рдЫрд┐рдкреЗ рд╣реБрдП рд╡рд░реНрдЧ CQtOpenCVImagePrivate , рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
 class CQtOpenCVImagePrivate { Q_DECLARE_PUBLIC(CQtOpenCVImage) public: CQtOpenCVImagePrivate(CQtOpenCVImage* owner); virtual ~CQtOpenCVImagePrivate(); CQtOpenCVImage* q_ptr; //      QGridLayout* f_grid_layout; //          QLabel* f_label;//   QLabel    QUrl f_capture_path;// URL      QImage* p_qt_image; //      QImage CvCapture* p_capture; //         OpenCV IplImage* p_opencv_frame; //      p_capture uint f_grayscaled:1; //       void init (); //   void close (); //     void free_qt_image (); //    p_qt_image void new_qt_image ();//     p_qt_image void free_capture (); //    p_capture void new_capture (); //     p_capture }; 

рдЪрд▓реЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
 /*----------------------------------------------------------------------------*/ void CQtOpenCVImagePrivate::init () { Q_ASSERT(q_ptr); f_grid_layout = new QGridLayout(q_ptr); Q_ASSERT(f_grid_layout); f_label = new QLabel(q_ptr/*, Qt::WindowNoState*/); Q_ASSERT(f_label); f_grid_layout->addWidget (f_label); p_qt_image = 0, p_capture = 0, p_opencv_frame = 0, f_grayscaled = 0; } /*----------------------------------------------------------------------------*/ inline void CQtOpenCVImagePrivate::close () { free_qt_image (); free_capture (); } /*----------------------------------------------------------------------------*/ CQtOpenCVImagePrivate::CQtOpenCVImagePrivate(CQtOpenCVImage* owner) : q_ptr(owner) { init (); } /*----------------------------------------------------------------------------*/ CQtOpenCVImagePrivate::~CQtOpenCVImagePrivate () { close (); if(!(f_label->parent ())) delete f_label; if(!(f_grid_layout->parent ())) delete f_grid_layout; } /*----------------------------------------------------------------------------*/ inline void CQtOpenCVImagePrivate::free_qt_image () { if(p_qt_image) { delete p_qt_image; p_qt_image = 0; } } /*----------------------------------------------------------------------------*/ inline void CQtOpenCVImagePrivate::free_capture () { if(p_capture) { cvReleaseCapture(&p_capture); p_capture = 0; } } 

рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рдФрд░ рдкрдардиреАрдп рд╣реИред рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдЙрдардирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ CQtOpenCVImage * рд╕реНрд╡рд╛рдореА рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ CQtOpenCVImage рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЪрд░ CQtOpenCVImage рдХреЗ рд░реВрдк рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрддрд╛ рд╣реИ :: __ptrред
рдбреЙрдХреНрдЯрд░ рдХреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдлрд┐рд▓реНрдо "рдлреЙрд░реНрдореВрд▓рд╛ рдСрдл рд▓рд╡" рд╕реЗ рд▓рд┐рдпреЛрдирд┐рдж рдмреНрд░реЛрдирд╡реЙрдп рдХреЗ рдирд╛рдпрдХ, "рддреЛ, рдореИрдВ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ ..."ред

рдкрд░ рдХрдмреНрдЬрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ new_capture рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ ред
 /*----------------------------------------------------------------------------*/ void CQtOpenCVImagePrivate::new_capture () { free_capture ();//   bool b_ok; int i_index = f_capture_path.toString ().toInt (&b_ok); //   ,   ,   URL /*   :  ,     CGI  ,     if(b_ok) { p_capture = cvCreateCameraCapture(i_index); if(p_capture) if(!p_opencv_frame) p_opencv_frame = cvQueryFrame (p_capture); } else { while((p_capture =cvCaptureFromFile(f_capture_path.toString ().toStdString ().c_str ()))) { p_opencv_frame = cvQueryFrame (p_capture); new_qt_image (); cvWaitKey (1000); } } */ // ,  ,  .     OpenCV. p_capture = b_ok ? cvCreateCameraCapture(i_index) : cvCaptureFromFile(f_capture_path.toString ().toStdString ().c_str ()); p_opencv_frame = p_capture ? cvQueryFrame (p_capture) : 0; //     OpenCV new_qt_image (); //   QImage } 

OpenCV рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдкрд░рд┐рдЪрдп рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордЧреНрд░реА рддрд╛рд▓рд┐рдХрд╛ рдкрдврд╝реЗрдВ

рдкреНрд░рдХрд╛рд░ рдХреА рдЗрдореЗрдЬрд┐рдВрдЧ QImage:
 /*----------------------------------------------------------------------------*/ void CQtOpenCVImagePrivate::new_qt_image () { if(!p_capture) return; free_qt_image (); //     if(p_opencv_frame) { //  OpenCV       IplImage *_tmp = f_grayscaled ? cvCreateImage( cvSize( p_opencv_frame->width, p_opencv_frame->height ), IPL_DEPTH_8U, 1 ) : cvCloneImage (p_opencv_frame) ; try { //    RGB    cvCvtColor( p_opencv_frame, _tmp, f_grayscaled ? CV_RGB2GRAY : CV_BGR2RGB ); //    QImage p_qt_image = new QImage( (const uchar*)(_tmp->imageData), _tmp->width, _tmp->height, _tmp->widthStep, (f_grayscaled ? QImage::Format_Indexed8 : QImage::Format_RGB888) ); emit q_ptr->signal_ImageChanged (); //    q_ptr->slot_setPixmap (QPixmap::fromImage (*p_qt_image)); //    QLabel } catch(...) { // ...  --  ,  ! close (); } //     ! cvReleaseImage(&_tmp); } } 



рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЗрд╕рдмрд░реНрдЧ рдХреЗ рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ

рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рднреА рд╕рд░рд▓ рд╣реИред рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рднреА рдЖрд▓рд╕реАред рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:
 /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ CQtOpenCVImage::CQtOpenCVImage(QWidget* parent, Qt::WindowFlags f) : QWidget(parent, f), d_ptr(new CQtOpenCVImagePrivate(this)) { } /*----------------------------------------------------------------------------*/ CQtOpenCVImage::~CQtOpenCVImage() { } /*----------------------------------------------------------------------------*/ QUrl& CQtOpenCVImage::getCapture () { return (d_func ()->f_capture_path); } /*----------------------------------------------------------------------------*/ QString CQtOpenCVImage::getLabelText () const { return (d_func ()->f_label->text ()); } /*----------------------------------------------------------------------------*/ bool CQtOpenCVImage::hasScaledContents() const { return d_func ()->f_label->hasScaledContents (); } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::slot_setScaledContents(bool Value ) { d_func ()->f_label->setScaledContents (Value); } /*----------------------------------------------------------------------------*/ bool CQtOpenCVImage::isGrayscale() const { return d_func ()->f_grayscaled; } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::slot_setGrayscale( bool Value ) { if(d_func ()->f_grayscaled != Value) { d_func ()->f_grayscaled = Value; if(!(d_func ()->p_capture)) d_func ()->new_capture (); else d_func ()->new_qt_image (); emit signal_Grayscale (d_func ()->f_grayscaled); } } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::slot_setLabelText ( const QString& Value ) { d_func ()->f_label->setText (Value); } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::slot_setCapture ( const QUrl& Value ) { //       // if(getCapture ().toString () != Value.toString () || !d_func ()->p_opencv_frame) // { d_func ()->f_capture_path = Value.toString ().trimmed (); d_func ()->new_capture (); emit signal_CaptureChanged (); // } } /*----------------------------------------------------------------------------*/ const QPixmap* CQtOpenCVImage::getPixmap () const { return ((const QPixmap*)(d_func ()->f_label->pixmap ())); } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::slot_setPixmap ( const QPixmap& Value ) { d_func ()->f_label->setPixmap (Value); emit signal_PixmapChanged (); } /*----------------------------------------------------------------------------*/ const QImage* CQtOpenCVImage::getImage () const { return(d_func ()->p_qt_image); } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::slot_setImage ( const QImage& Value ) { d_func ()->free_qt_image (); d_func ()->p_qt_image = new QImage(Value); slot_setPixmap (QPixmap::fromImage (*(d_func ()->p_qt_image))); emit signal_ImageChanged (); } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::slot_setQLabel ( const QLabel& Value) { d_func ()->f_label->setText (Value.text ()); emit signal_LabelChanged (); } /*----------------------------------------------------------------------------*/ Qt::Alignment CQtOpenCVImage::getAlignment() const { return(d_func ()->f_label->alignment ()); } /*----------------------------------------------------------------------------*/ void CQtOpenCVImage::setAlignment(Qt::Alignment Value) { d_func ()->f_label->setAlignment (Value); emit signal_AlignmentChanged (); } /*----------------------------------------------------------------------------*/ const QLabel* CQtOpenCVImage::getQLabel () const { return ((const QLabel*)(d_func ()->f_label)); } 


рд╣рдо рдПрдХ рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ images.pro рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
 TARGET = QtOpenCVImages TARGET = $$qtLibraryTarget($$TARGET) TEMPLATE = lib CONFIG += debug_and_release 

рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:
 DEFINES += QDESIGNER_EXPORT_WIDGETS 

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 unix:!symbian { target.path = $$PWD/../../../../lib DESTDIR = $$PWD/../../../../lib INSTALLS += target } 


рд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 SOURCES += \ cqtopencvimage.cpp HEADERS += \ cqtopencvimage.h 


OpenCV рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╣реЗрдбрд░ рдХреЗ рдкрде рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 INCLUDEPATH += /usr/include/opencv2 DEPENDPATH += /usr/include/opencv2 


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ OpenCV рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдХреЛрд░ рдФрд░ рд╣рд╛рдИрдЧреБрдИ) рдЬреЛрдбрд╝реЗрдВ:
 #win32:CONFIG(release): LIBS += -L/usr/lib/ -lopencv_core #else:win32:CONFIG(debug, debug|release): LIBS += -L/usr/lib/ -lopencv_cored #else: unix: LIBS += -L/usr/lib/ -lopencv_core #win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../../usr/lib/release/ -lopencv_highgui #else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../../usr/lib/debug/ -lopencv_highguid #win32:CONFIG(release): LIBS += -L/usr/lib/release/ -lopencv_highgui #else:symbian: LIBS += -lopencv_highgui #else: unix: LIBS += -L/usr/lib/ -lopencv_highgui 


рдкреНрд░рд┐рдп рд╡рд┐рдВрдбреЛрдЬ рдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╕реБрдИ рдХреЛ "рдмрдВрдж рдХрд░ рджрд┐рдпрд╛" рдФрд░ рдореИрдВ рдЖрдкрдХреЗ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрде рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдк рдореВрд░реНрдЦ рд▓реЛрдЧ рдирд╣реАрдВ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗред
* NIX oids, /usr/lib рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рди рд╕реЗ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ln -s рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд▓рд┐рдВрдХ рдмрдирд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓реЗрдЧрд╛!

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ OpenCV рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬрд╝реБрдЕрд▓ рдШрдЯрдХ рдХреА рдПрдХ рдЧрддрд┐рд╢реАрд▓ Qt рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдИ рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб: рд╡реВ рдПрдХ рд▓рд╛ (рд╢рд╛рдмреНрджрд┐рдХ)

рдбрд┐рдЬрд╝рд╛рдЗрди

рдпрд╣ рд╣рдорд╛рд░реЗ рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдПрдХ рдкреНрд▓рдЧрдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдБ:
 TARGET = QtOpenCVWidgets TARGET = $$qtLibraryTarget($$TARGET) TEMPLATE = lib CONFIG += designer plugin release DEFINES += QDESIGNER_EXPORT_WIDGETS SOURCES += \ qtopencvimageplugin.cpp \ ../qtopencvwidgets.cpp HEADERS +=\ qtopencvimageplugin.h \ ../qtopencvwidgets.h \ ../runtime/images/cqtopencvimage.h RESOURCES += \ qtopencvimages.qrc unix:!symbian { target.path = $$PWD/../../../lib DESTDIR = $$PWD/../../../lib INSTALLS += target } INCLUDEPATH += /usr/include/opencv2 DEPENDPATH += /usr/include/opencv2 #win32:CONFIG(release, debug|release): LIBS += -L/usr/lib/ -lQtOpenCVImages #else:win32:CONFIG(debug, debug|release): LIBS += -L/usr/lib -lQtOpenCVImages #else:symbian: LIBS += -lQtOpenCVImages #else: unix: LIBS += -L/usr/lib -lQtOpenCVImages INCLUDEPATH += $$PWD/../runtime/images DEPENDPATH += $$PWD/../runtime/images 

рдПрдХ рд░рдирдЯрд╛рдЗрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЖрдЗрдП рдХреБрдЫ рдЕрдВрддрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рд╣рдо Qt рдХреЗ рд╕рднреА рдХреИрдирди рдХреЗ рдЕрдиреБрд╕рд╛рд░ Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдкреНрд▓рдЧрдЗрди рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ: Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдирд╛ ( coffeesmoke , рдЬреИрд╕рд╛ рдХрд┐ рдЬрд╝реЛрд░ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ!)ред
qtopencvimageplugin.h
 #ifndef QTOPENCVIMAGEPLUGIN_H #define QTOPENCVIMAGEPLUGIN_H #include <QObject> #include <QDesignerCustomWidgetInterface> class QtOpenCVImagePlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit QtOpenCVImagePlugin(QObject *parent = 0); QString name() const; QString includeFile() const; QString group() const; QIcon icon() const; QString toolTip() const; QString whatsThis() const; bool isContainer() const; QWidget* createWidget(QWidget *parent); void initialize(QDesignerFormEditorInterface *core); bool isInitialized() const; QString domXml() const; signals: public slots: private: bool f_init; }; #endif // QTOPENCVIMAGEPLUGIN_H 

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░: Q_INTERFACE рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, QDesignerCustomWidgetInterface рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдФрд░ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред

qtopencvimageplugin.cpp
 #include "qtopencvimageplugin.h" #include "cqtopencvimage.h" QtOpenCVImagePlugin::QtOpenCVImagePlugin(QObject *parent) : QObject(parent), f_init(false) { } QString QtOpenCVImagePlugin::name() const { return "CQtOpenCVImage";//    } QString QtOpenCVImagePlugin::includeFile() const { return QLatin1String("cqtopencvimage.h"); //     ui_*.h   } QString QtOpenCVImagePlugin::group() const { return tr("OpenCV Widgets"); //       Qt Designer } QIcon QtOpenCVImagePlugin::icon() const { return QIcon(":QtOpenCVLogo.png"); //   } QString QtOpenCVImagePlugin::toolTip() const { return QString(); } QString QtOpenCVImagePlugin::whatsThis() const { return QString(); } bool QtOpenCVImagePlugin::isContainer() const { return false; } QWidget* QtOpenCVImagePlugin::createWidget(QWidget *parent) { return new CQtOpenCVImage(parent); //  ,     ! } void QtOpenCVImagePlugin::initialize(QDesignerFormEditorInterface *core) { //        if (f_init) return; f_init = true; } bool QtOpenCVImagePlugin::isInitialized() const { return f_init; } QString QtOpenCVImagePlugin::domXml() const { //     return "<ui language=\"c++\">\n" " <widget class=\"CQtOpenCVImage\" name=\"QtOpenCVImage\">\n" " <property name=\"geometry\">\n" " <rect>\n" " <x>0</x>\n" " <y>0</y>\n" " <width>400</width>\n" " <height>200</height>\n" " </rect>\n" " </property>\n" " </widget>\n" "</ui>"; } 



рдмрд╣реБрдд рдХрдо рдмрдЪрд╛ рд╣реИ: Qt <-> OpenCV рд╕рдореВрд╣ рдХреЗ рд╣рдорд╛рд░реЗ рд╕рднреА рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рд░рдг-рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдПрдВ
qtopencvwidgets.h
 #ifndef QTOPENCVWIDGETS_H #define QTOPENCVWIDGETS_H #include <QObject> #include <QtPlugin> #include <QDesignerCustomWidgetCollectionInterface> class QtOpenCVWidgets : public QObject, public QDesignerCustomWidgetCollectionInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetCollectionInterface) public: explicit QtOpenCVWidgets(QObject *parent = 0); QList<QDesignerCustomWidgetInterface*> customWidgets() const { return f_plugins; } private: QList<QDesignerCustomWidgetInterface *> f_plugins; }; #endif // QTOPENCVWIDGETS_H 


qtopencvwidgets.cpp
 #include "qtopencvwidgets.h" #include "images/qtopencvimageplugin.h" QtOpenCVWidgets::QtOpenCVWidgets(QObject *parent) : QObject(parent) { f_plugins << new QtOpenCVImagePlugin(this); } //Q_DECLARE_INTERFACE(QtOpenCVWidgets, "com.trolltech.Qt.Designer.QtOpenCV") Q_EXPORT_PLUGIN2(qtopencvwidgetsplugin, QtOpenCVWidgets) 

рдмреНрдпрд╛рдЬ рдХреА рд░рдЪрдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН: f_plugins << new QtOpenCVImagePlugin(this); ред рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдирдП рдШрдЯрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдФрд░ f_plugins рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝рдХрд░ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ << рдирдпрд╛ <рдЕрдЧрд▓рд╛> рдкреНрд▓рдЧрдЗрди (рдпрд╣);
рдЖрд╡реЗрджрди

Qt рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдЦреЛрд▓реЗрдВ рдФрд░ рдШрдЯрдХ рдкреИрд▓реЗрдЯ рдореЗрдВ рд╣рдорд╛рд░реЗ QtOpenCVImage рдХреЛ рджреЗрдЦреЗрдВред рд╣рдо рдЗрд╕реЗ рдПрдХ рдирдП рд░реВрдк рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рдХреИрдкреНрдЪрд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд URL рдореЗрдВ рдмрджрд▓реЗрдВ 192.168.0.20:8080/image.jpg 192.168.0.20:8080/image.jpg ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреИрдорд░рд╛ рд╕рд░реНрд╡рд░ рдХрд╛ рдЬрд╛рд╡рд╛ рдПрдкрд▓реЗрдЯ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдлреНрд░реЗрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
grayscale рд╕рдВрдкрддреНрддрд┐ рдХреА grayscale
рд╕реНрд░реЛрдд рдХреЛрдб: рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рди рдХрд░реЗрдВ ред

рдирд┐рд╖реНрдХрд░реНрд╖



рдХреНрд╖реБрдзрд╛


рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рдорд▓рд╛

рдЖрдЗрдП рдПрдХ рдорд╛рдирдХ рдХреНрдпреВрдЯреА рдЬреАрдпреВрдЖрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ, рд╡рд┐рдВрдбреЛ рдХрд╛ рдореБрдЦреНрдп рд░реВрдк рдЦреЛрд▓реЗрдВ, рдЗрд╕рдореЗрдВ рд╕реЗ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рд░рдЦреЗрдВ, рдХреБрдЫ рд╕реЗрд╡рд╛ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред
рдорд╛рди 0 (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛) рдореЗрдВ "рдкрддрд╛ ..." рдмрджрд▓реЗрдВ рдФрд░ рдЫрд╡рд┐ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦреЗрдВред

рд╕реНрд░реЛрдд рдХреЛрдб: рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рди рдХрд░реЗрдВ ред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?



рдСрд▓ рдж рдмреЗрд╕реНрдЯред

Source: https://habr.com/ru/post/In146210/


All Articles