{"id":602,"date":"2023-06-23T09:08:54","date_gmt":"2023-06-23T01:08:54","guid":{"rendered":"https:\/\/www.gzlcy.cn\/?p=602"},"modified":"2023-06-23T09:08:54","modified_gmt":"2023-06-23T01:08:54","slug":"opencv%e6%89%8b%e6%8b%89%e6%89%8b01-%e8%af%bb%e5%8f%96%e5%9b%be%e5%83%8f%e5%b9%b6%e6%98%be%e7%a4%ba","status":"publish","type":"post","link":"http:\/\/www.gzlcy.cn\/?p=602","title":{"rendered":"OpenCV\u624b\u62c9\u624b01 &#8212; \u8bfb\u53d6\u56fe\u50cf\u5e76\u663e\u793a"},"content":{"rendered":"<p>OpenCV\uff0c\u5f00\u6e90\u8ba1\u7b97\u673a\u89c6\u89c9\u5e93\uff0c\u96c6\u6210\u4e86\u4f17\u591a\u4f18\u79c0\u7684\u56fe\u50cf\u5904\u7406\u7b97\u6cd5\uff0c\u662f\u4ece\u4e8b\u673a\u5668\u89c6\u89c9\u3001\u8ba1\u7b97\u673a\u89c6\u89c9\u76f8\u5173\u9886\u57df\u5f00\u53d1\u53ca\u7814\u7a76\u5de5\u4f5c\u5fc5\u5907\u6280\u80fd\u3002<\/p>\n<p>\u672c\u6587\u4f7f\u7528\u7684\u5f00\u53d1\u5de5\u5177\u4e3aQT6.4.2\u3001OpenCV4.7.0\uff1b<\/p>\n<p>\u76ee\u6807\uff1a\u4f7f\u7528OpenCV\u8bfb\u53d6\u4e00\u5f20\u56fe\u7247\uff0c\u5e76\u5728QT\u754c\u9762\u4e0a\u663e\u793a\u3002<\/p>\n<p>1\u3001\u6253\u5f00QT \uff0c\u6587\u4ef6&#8211;&gt;\u65b0\u5efa\u5de5\u7a0b&#8211;&gt;Application(Qt)&#8211;&gt;Qt Widgets Application&#8211;&gt;\u9009\u62e9<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/6e1e3f8884884c74bb91b91a08b65d6f.png' alt='\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417' \/><\/p>\n<p>2\u3001\u8f93\u5165\u9879\u76ee\u540d\u79f0&#8212;&gt;\u4e0b\u4e00\u6b65<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/79b5df69ea1443b8ab4878f3a9e08431.png' alt='\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb_\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417' \/><\/p>\n<p>3\u3001\u9009\u62e9qmake&#8212;&gt;\u4e0b\u4e00\u6b65<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/8f295799baa7412e9191058098301b4d.png' alt='\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417' \/><\/p>\n<p>4\u586b\u5199\u7c7b\u540d\uff0c\u9009\u62e9base class \uff0c\u52fe\u9009Generate form &#8212;&gt;\u4e0b\u4e00\u6b65<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/6eb05cf61919452e91c579e95ccc2004.png' alt='\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417_\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb' \/><\/p>\n<p>5\u3001\u9009\u62e9\u8bed\u8a00\uff08\u53ef\u76f4\u63a5\u70b9\u51fb\u4e0b\u4e00\u6b65\uff0c\u6216\u9009\u62e9\u81ea\u5df1\u559c\u6b22\u7684\u8bed\u8a00\uff09<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/9ff91f963d3e4bb48289758710610bd5.png' alt='\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417_\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb' \/><\/p>\n<p>6\u3001\u9009\u62e9\u5957\u4ef6\uff08\u63a8\u8350\u4f7f\u7528MSVC64bit\uff09&#8212;&gt;\u4e0b\u4e00\u6b65<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/b3e787bba86b4f0d90fb6e67f00713e2.png' alt='\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb' \/><\/p>\n<p>7\u3001\u70b9\u51fb\u5b8c\u6210<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/89450730363b4e2d93c83ddc6b5dba9c.png' alt='\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb' \/><\/p>\n<p>8\u3001\u8bbe\u8ba1UI \uff1a\u53cc\u51fbui\u6587\u4ef6\uff0c\u8fdb\u5165\u8bbe\u8ba1\u754c\u9762\uff0c\u62d6\u62fd\u63a7\u4ef6\u81f3\u76f8\u5173\u4f4d\u7f6e\uff0c\u5e76\u7ed9\u63a7\u4ef6\u547d\u540d\uff08\u547d\u540d\u9700\u5177\u5907\u4e00\u5b9a\u89c4\u8303\uff0c\u517b\u6210\u826f\u597d\u4e60\u60ef\u4fbf\u4e8e\u9ad8\u6548\u5f00\u53d1\uff09<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/de2ed756971a4097abe457ea128453b5.png' alt='\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417' \/><\/p>\n<p>\u6ce8\u610f\uff1a\u53f3\u952e\u5355\u51fbGraphicView\uff0c\u63d0\u5347\u4e3aImageView\u7c7b<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/45298e07a0f547dd8acdac1b112ceb6c.png' alt='\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417' \/><\/p>\n<p>9\u3001\u7f16\u5199ImageView.h\u6587\u4ef6<\/p>\n<p><pre><code class=\"language-cpp\">#ifndef IMAGEVIEWER_H\n#define IMAGEVIEWER_H\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \"opencv2\/opencv.hpp\"\nclass ImageViewer : public QGraphicsView\n{\n    Q_OBJECT\npublic:\n    \/\/ \u6784\u9020\u51fd\u6570 explicit\u5173\u952e\u5b57\u4e3a\u7981\u6b62\u9690\u5f0f\u8f6c\u6362\uff0c\u53ef\u53c2\u8003\u300aEffective C++\u300b\n    explicit ImageViewer(QWidget *parent = nullptr);\npublic:  \/\/ \u516c\u5171\u6210\u5458\u51fd\u6570\n    void setQImage(QImage);  \/\/\u663e\u793aQImage\n    void setMatImage(cv::Mat ); \/\/\u663e\u793aMat\n    void setPixmap(QPixmap); \/\/ \u663e\u793aQPixmap\n    void resetImage(); \/\/\u6e05\u695a\u56fe\u50cf\n    QImage getQImage(); \/\/\u83b7\u53d6QImage\n    cv::Mat getMatImage(); \/\/ \u83b7\u53d6\u77e9\u9635\n    QPixmap getPixmap(); \/\/ \u83b7\u53d6QPixmap\nprotected: \/\/ \u4fdd\u62a4\u6210\u5458\u51fd\u6570\n    \/\/ \u91cd\u8f7d\u7236\u7c7bQGraphicsView\u7684\u6210\u5458\u51fd\u6570\n    virtual void wheelEvent(QWheelEvent *event) override;    \/\/ virtual \u865a\u51fd\u6570\uff1boverride \u91cd\u8f7d\n    virtual void keyPressEvent(QKeyEvent *event) override;   \n    virtual void mousePressEvent(QMouseEvent *event) override;\n    virtual void mouseMoveEvent(QMouseEvent *event) override;\n    virtual void mouseReleaseEvent(QMouseEvent *event) override;\n    void zoom(QPoint factor); \/\/ \u7f29\u653e\n    void togglePan(bool pan, const QPoint &amp;startPos = QPoint()); \n    void pan(const QPoint &amp;panTo);\n    void initShow(); \/\/ \n  \nprivate: \/\/ \u79c1\u6709\u6210\u5458\u53d8\u91cf\n    QPixmap m_image; \n    bool m_isPan;\n    QPoint m_prevPan;\n    QGraphicsScene *scene;\n};\n#endif \/\/ IMAGEVIEWER_H\n<\/code><\/pre>\n<\/p>\n<p>10\u3001\u7f16\u5199ImageView.cpp \u6587\u4ef6<\/p>\n<p><pre><code class=\"language-cpp\">#include \"imageviewer.h\"\n#include \nImageViewer::ImageViewer(QWidget *parent) \/\/ \u6784\u9020\u51fd\u6570\n    : QGraphicsView{parent}, \/\/ \u7236\u7c7b\n    m_isPan(false), \/\/ \u79c1\u6709\u53d8\u91cf\u521d\u59cb\u5316\n    m_prevPan(0,0),\n    scene(nullptr)\n{\n    scene = new QGraphicsScene(this);\n    this-&gt;setScene(scene);\n    setDragMode(QGraphicsView::DragMode::NoDrag); \/\/ \u62d6\u62fd\u6a21\u5f0f\n    setInteractive(false); \/\/ \u4ea4\u4e92\n    setEnabled(false);\n}\n\/\/ Mat\u8f6cQImage\nQImage cvMatToQImage(cv::Mat &amp;src)\n{\n    if(src.channels() == 1) { \/\/ if grayscale image\n        return QImage((uchar*)src.data, src.cols, src.rows, static_cast(src.step), QImage::Format_Grayscale8).copy();\n    }\n    if(src.channels() == 3) { \/\/ if 3 channel color image\n        cv::Mat rgbMat;\n        cv::cvtColor(src, rgbMat, cv::COLOR_BGR2RGB); \/\/ invert BGR to RGB\n        return QImage((uchar*)rgbMat.data, src.cols, src.rows, static_cast(src.step), QImage::Format_RGB888).copy();\n    }\n    return QImage();\n}\n\/\/\u5c06QImage\u8f6c\u5316\u4e3aMat\ncv::Mat qImageToCvMat( const QImage &amp;inImage)\n{\n    switch (inImage.format())\n    {\n    case QImage::Format_RGB32:\n    case QImage::Format_RGB888:\n    {\n        QImage   swapped = inImage;\n        if ( inImage.format() == QImage::Format_RGB32 )\n        {\n            swapped = swapped.convertToFormat( QImage::Format_RGB888 );\n        }\n        cv::Mat matImg = cv::Mat(swapped.height(), swapped.width(),\n                                  CV_8UC3,\n                                  const_cast(swapped.bits()),\n                                  static_cast(swapped.bytesPerLine())\n                                  );\n        cv::cvtColor(matImg,matImg,cv::COLOR_RGB2BGR);\n        return matImg.clone();\n    }\n    case QImage::Format_Indexed8:\n    {\n        cv::Mat  mat( inImage.height(), inImage.width(),\n                      CV_8UC1,\n                      const_cast(inImage.bits()),\n                      static_cast(inImage.bytesPerLine())\n                      );\n        return mat.clone();\n    }\n    default:\n        break;\n    }\n    return cv::Mat();\n}\nvoid ImageViewer::setQImage(QImage image)\n{   if(image.isNull())\n        return;\n    m_image = QPixmap::fromImage(image);\n    initShow();\n}\nvoid ImageViewer::setMatImage(cv::Mat src)\n{\n    if(src.empty())\n        return;\n    m_image = QPixmap::fromImage(cvMatToQImage(src));\n    initShow();\n}\nvoid ImageViewer::setPixmap(QPixmap pixmap)\n{\n    m_image = pixmap.copy();\n    initShow();\n}\nvoid ImageViewer::resetImage()\n{\n    if(m_image.isNull())\n        return;\n    scene-&gt;clear();\n    setEnabled(false);\n}\nQImage  ImageViewer::getQImage()\n{\n    return m_image.toImage();\n}\ncv::Mat ImageViewer::getMatImage()\n{\n    return qImageToCvMat(m_image.toImage());\n}\nQPixmap ImageViewer::getPixmap()\n{\n    return m_image;\n}\nvoid ImageViewer::initShow()\n{\n    setEnabled(true);\n    setMouseTracking(true);\n    scene-&gt;clear();\n    scene-&gt;addPixmap(m_image);\n    scene-&gt;update();\n    this-&gt;resetTransform();\n    this-&gt;setSceneRect(m_image.rect());\n    this-&gt;fitInView(QRect(0, 0, m_image.width(), m_image.height()), Qt::KeepAspectRatio);\n}\n\/\/ \u9f20\u6807\u70b9\u51fb\u4e8b\u4ef6\nvoid ImageViewer::mousePressEvent(QMouseEvent *event)\n{\n    if(event-&gt;button() == Qt::LeftButton){\n        togglePan(true, event-&gt;pos());\n        event-&gt;accept();\n        return;\n    }\n    event-&gt;ignore();\n}\n\/\/ \u9f20\u6807\u79fb\u52a8\u4e8b\u4ef6\nvoid ImageViewer::mouseMoveEvent(QMouseEvent *event)\n{\n    if(m_isPan) {\n        pan(event-&gt;pos());\n        event-&gt;accept();\n        return;\n    }\n    event-&gt;ignore();\n}\n\/\/ \u9f20\u6807\u91ca\u653e\u4e8b\u4ef6\nvoid ImageViewer::mouseReleaseEvent(QMouseEvent *event)\n{\n    if(event-&gt;button() == Qt::LeftButton){\n        togglePan(false);\n        event-&gt;accept();\n        return;\n    }\n    event-&gt;ignore();\n}\n\/\/ \u7f29\u653e\nvoid ImageViewer::zoom(QPoint factor)\n{\n    QRectF FOV = this-&gt;mapToScene(this-&gt;rect()).boundingRect();\n    QRectF FOVImage = QRectF(FOV.left(), FOV.top(), FOV.width(), FOV.height());\n    float scaleX = static_cast(m_image.width()) \/ FOVImage.width();\n    float scaleY = static_cast(m_image.height()) \/ FOVImage.height();\n    float minScale = scaleX &gt; scaleY ? scaleY : scaleX;\n    float maxScale = scaleX &gt; scaleY ? scaleX : scaleY;\n    if ((factor.y() &gt; 0 &amp;&amp; minScale &gt; 100) || (factor.y() &lt; 0 &amp;&amp; maxScale 0)\n        scale(1.2, 1.2);\n    else\n        scale(0.8, 0.8);\n}\n\/\/\u952e\u76d8\u6309\u952e\u4e8b\u4ef6\nvoid ImageViewer::keyPressEvent(QKeyEvent *event)\n{\n    if(event-&gt;key() == Qt::Key_O) {\n        this-&gt;resetTransform();\n        this-&gt;setSceneRect(m_image.rect());\n        this-&gt;fitInView(QRect(0, 0, m_image.width(), m_image.height()), Qt::KeepAspectRatio);\n    }\n}\nvoid ImageViewer::pan(const QPoint &amp;panTo)\n{\n    auto hBar = horizontalScrollBar();\n    auto vBar = verticalScrollBar();\n    auto delta = panTo - m_prevPan;\n    m_prevPan = panTo;\n    hBar-&gt;setValue(hBar-&gt;value() - delta.x());\n    vBar-&gt;setValue(vBar-&gt;value() - delta.y());\n}\n\/\/ \u6eda\u8f6e\u4e8b\u4ef6\nvoid ImageViewer::wheelEvent(QWheelEvent *event)\n{\n    if(m_image.isNull())\n        return;\n    QPoint numDegrees = event-&gt;angleDelta() \/ 8;\n    if (!numDegrees.isNull()) {\n        QPoint numSteps = numDegrees \/ 15;\n        zoom(numSteps);\n    }\n    event-&gt;accept();\n}\nvoid ImageViewer::togglePan(bool pan, const QPoint &amp;startPos)\n{\n    if(pan){\n        if(m_isPan) {\n            return;\n        }\n        m_isPan = true;\n        m_prevPan = startPos;\n        setCursor(Qt::ClosedHandCursor);\n    } else {\n        if(!m_isPan) {\n            return;\n        }\n        m_isPan = false;\n        m_prevPan = QPoint(0,0);\n        setCursor(Qt::ArrowCursor);\n    }\n}\n<\/code><\/pre>\n<\/p>\n<p>11\u3001\u7f16\u5199read_and_show_img.h\u6587\u4ef6<\/p>\n<p><pre><code class=\"language-cpp\">#ifndef READANDSHOWIMG_H\n#define READANDSHOWIMG_H\n#include \n#include \"ImageViewer.h\"\nQT_BEGIN_NAMESPACE\nnamespace Ui { class ReadAndShowImg; }\nQT_END_NAMESPACE\nclass ReadAndShowImg : public QMainWindow\n{\n    Q_OBJECT\npublic:\n    ReadAndShowImg(QWidget *parent = nullptr);\n    ~ReadAndShowImg();\nprivate slots:\n    void on_btn_filePath_clicked();\n    void on_btn_readAndShow_clicked();\nprivate:\n    Ui::ReadAndShowImg *ui;\n    QString filePath;\n\/\/    ImageViewer * m_view;\n};\n#endif \/\/ READANDSHOWIMG_H\n<\/code><\/pre>\n<\/p>\n<p>12\u3001\u7f16\u5199read_and_show_img.cpp\u6587\u4ef6<\/p>\n<p><pre><code class=\"language-cpp\">#include \"read_and_show_img.h\"\n#include \"ui_read_and_show_img.h\"\n#include \n#include \"opencv2\/opencv.hpp\"\nReadAndShowImg::ReadAndShowImg(QWidget *parent)\n    : QMainWindow(parent)\n    , ui(new Ui::ReadAndShowImg)\n{\n    ui-&gt;setupUi(this);\n    setWindowTitle(\"\u8bfb\u53d6\u5e76\u663e\u793a\u56fe\u7247\");   \/\/ \u6ce8\u610f\u8fd9\u4e00\u53e5\u8981\u5728setupUi\u4e4b\u540e,\u5426\u5219\u4e0d\u8d77\u6548\u679c\n}\nReadAndShowImg::~ReadAndShowImg()\n{\n    delete ui;\n}\nvoid ReadAndShowImg::on_btn_filePath_clicked()\n{\n    filePath = QFileDialog::getOpenFileName(this,\"open file dialog\",\"E:\\Img\\\",\"JPG(*.jpg);;PNG(*.png);;BMP(*.jpeg)\");\n    ui-&gt;let_filePath-&gt;setText(filePath);\n}\nvoid ReadAndShowImg::on_btn_readAndShow_clicked()\n{\n    cv::Mat src = cv::imread(filePath.toStdString(),1);\n    ui-&gt;gpv_img-&gt;setMatImage(src);\n}\n<\/code><\/pre>\n<\/p>\n<p>13\u3001main\u6587\u4ef6\u4fdd\u6301\u539f\u6837<\/p>\n<p><pre><code class=\"language-cpp\">#include \"read_and_show_img.h\"\n#include \nint main(int argc, char *argv[])\n{\n    QApplication a(argc, argv);\n    ReadAndShowImg w;\n    w.show();\n    return a.exec();\n}\n<\/code><\/pre>\n<\/p>\n<p>\u5b8c\u6210\u4ee5\u4e0a\u6587\u4ef6\u7684\u7f16\u5199\uff0c\u5373\u53ef\u8fd0\u884c\u7a0b\u5e8f\u3002ImageView\u63a7\u4ef6\u652f\u6301\u56fe\u50cf\u7684\u7f29\u653e\uff0c\u62d6\u62fd\u7b49\u64cd\u4f5c\u3002<\/p>\n<p>\u8fd0\u884c\u6548\u679c\uff1a<\/p>\n<p><img src='https:\/\/img-blog.csdnimg.cn\/09f0ee1f5a6a4bc1a836f7073a671e0b.png' alt='\u6587\u80fd\u63d0\u7b14\u63a7\u841d\u8389\uff0c\u6b66\u80fd\u5e8a\u4e0a\u5b9a\u4eba\u59bb_\u80fd\u663e\u793a\u5e76\u7f29\u653e\u56fe\u7247\u7684\u63a7\u4ef6_\u5c71\u80fd\u91d1\u63a7\u548c\u5c71\u91d1\u91d1\u63a7\u662f\u4e00\u5bb6\u5417' \/><\/p>\n<p>\u6ce8\u610f\uff0c\u4e3a\u56fe\u7701\u4e8b\uff0c\u672c\u6587\u4e2d\u7684ImageView\u7c7b\u6458\u81ea\u4e92\u8054\u7f51\uff0c\u539f\u6587\u94fe\u63a5\u4e3a\uff1a<\/p>\n<p>\u3010[Qt]\u57fa\u4e8eQGraphicsView\u7684\u56fe\u50cf\u663e\u793a\u63a7\u4ef6\uff0c\u652f\u6301\u653e\u5927\u3001\u7f29\u5c0f\u3001\u9f20\u6807\u62d6\u52a8\u3011_qt \u56fe\u50cf\u63a7\u4ef6_xiaohuihuihuige\u7684\u535a\u5ba2-CSDN\u535a\u5ba2<\/p>\n","protected":false},"excerpt":{"rendered":"<p>OpenCV\u8bfb\u53d6\u56fe\u50cf\u5e76\u5728Qt\u754c\u9762\u4e2d\u663e\u793a\uff0c\u81ea\u5b9a\u4e49\u63a7\u4ef6ImageView\u652f\u6301\u56fe\u50cf\u7684\u7f29\u653e\u4e0e\u62d6\u62fd\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[1122],"_links":{"self":[{"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=\/wp\/v2\/posts\/602"}],"collection":[{"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=602"}],"version-history":[{"count":0,"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=\/wp\/v2\/posts\/602\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=602"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=602"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gzlcy.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}