AI视觉处理--OpenCV编译安装


操作系统: Windows10
编 译 器: mingw32(QT5自带)
软件版本: OpenCV3.4.1

准备工作:

下载并安装CMAKE
修改环境变量,将cmake及mingw32编译器的路径加入path(重要,否则会出错)

C:\Program Files\CMake\bin
D:\Qt\Qt5.12.9\Tools\mingw730_32\bin

下载并解压OpenCV源码

创建build目录及install目录


执行cmake:
指定源码目录,指定编译目录(build)

点Configure:(如果采用VS编译器,操作相同)
选择MinGW Makefiles
选择Specify native compilers
指定C/C++编译器(QT5自带的mingw编译器),Fortran编译器不用理会:

D:/Qt/Qt5.12.9/Tools/mingw730_32/bin/gcc.exe
D:/Qt/Qt5.12.9/Tools/mingw730_32/bin/g++.exe

选择WITH_QT,并指定QT5文件相关目录(与安装版本及路径有关)

QT_QMAKE_EXECUTABLE值为:D:\Qt\Qt5.12.9\5.12.9\mingw73_32/bin/qmake.exe
Qt5Concurrent_DIR值为:  D:\Qt\Qt5.12.9\5.12.9\mingw73_32/lib/cmake/Qt5Concurrent
Qt5Core_DIR值为:        D:\Qt\Qt5.12.9\5.12.9\mingw73_32/lib/cmake/Qt5Core
Qt5Gui_DIR值为:         D:\Qt\Qt5.12.9\5.12.9\mingw73_32/lib/cmake/Qt5Gui
Qt5Test_DIR值为:        D:\Qt\Qt5.12.9\5.12.9\mingw73_32/lib/cmake/Qt5Test
Qt5Widgets_DIR值为:     D:\Qt\Qt5.12.9\5.12.9\mingw73_32/lib/cmake/Qt5Widgets
Qt5OpenGL值为为:        D:\Qt\Qt5.12.9\5.12.9\mingw73_32/lib/cmake/Qt5OpenGL

点Generate生成配置文件

关闭CMAKE,在build目录中shift+右键调用管理员命令: "在此处打列Powershell窗口"
执行编译命令:

 mingw32-make -j 8

安装:默认安装在build目录下的install中,也可以在配置时指定

 mingw32-make install

错误处理:

error: 'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA'

修改modules\videoio\src\cap_dshow.cpp忽略安全检查

#define STRSAFE_NO_DEPRECATE
mingw32-make[2]: *** [modules\dnn\CMakeFiles\opencv_dnn.dir\build.make:1095: modules/dnn/CMakeFiles/opencv_dnn.dir/layers/layers_common.avx512_skx.cpp.obj] Error 1

运行CMAKE重新配置参数:

CPU_DISPATCH    AVX2

QT5部署测试:

1.将bin目录添加至PATH变量(重要,否则不能运行)
2.新建QT5工程,将include目录及lib目录复制到工程目录
3.中修改.pro文件添加内容

INCLUDEPATH+=$$PWD\opencv\include
INCLUDEPATH+=$$PWD\opencv\include\opencv
INCLUDEPATH+=$$PWD\opencv\include\opencv2
LIBS += $$PWD\opencv\x86\mingw\lib\libopencv_*.a

示例代码:

#include "opencv.hpp"

using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Mat image=imread("d:\\123.bmp");
    namedWindow("显示测试");
    imshow("显示测试",image);
    waitKey(0);
    return a.exec();
}

通过label控件显示:

// 颜色空间转换
cvtColor(img_mat, img_rgb, CV_BGR2RGB);

// 转换成QImage格式
QImage img_show = QImage((const uchar*)(img_rgb.data),
                    img_rgb.cols,
                    img_rgb.rows,
                    img_rgb.cols * img_rgb.channels(),
                    QImage::Format_RGB888);
// 显示
ui->label->setPixmap(QPixmap::fromImage(img_show));

文件下载问题: 在配置过程中可能会遇到下载一些第三方源文件的情况,可以事先下载好,修改cmake文件指定位置,在配置的时候即可自动从本地下载。

例如: 3rdparty/ippicv/ippicv.cmake

"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"

修改为本地路径:

  "file:///home/downloads/"

VS2012编译:

Configure中选择vs2012,根据需要选择64或32bit,其他不用修改
Generate生成工程
Open Project打开工程,生成-->重新生成
右键左侧解决方案列表,选择CMakeTargets-->INSTALL-->生成
即可在install目录下生成。


Ubuntu20.04/Rasip(gcc)

安装cmake:

sudo  apt-get  install  cmake  cmake-qt-gui    cmake-curses-gui

# 下载opencv源码,可以直接下载后解压
git clone https://github.com/opencv/opencv.git
mkdir -p opencv/build && cd opencv/build

# Run CMake to generate makefiles
cmake -D CMAKE_BUILD_TYPE=RELEASE \
            -D CMAKE_INSTALL_PREFIX=/usr/local/ \
            -D INSTALL_C_EXAMPLES=OFF \
            -D WITH_TBB=ON \
            -D WITH_V4L=ON \
            -D WITH_QT=ON \
            -D WITH_OPENGL=ON \
            -D BUILD_EXAMPLES=OFF \
            -D BUILD_PERF_TESTS=OFF \
            -D BUILD_TESTS=OFF \
            -D BUILD_DOCS=OFF \
            ..

# Build and install
make -j$(nproc)
make install

- 阅读全文 -

QT5开发笔记(21)--容器


QVector 连续容器,相当于C语言的结构体数组,使用连续的空间,支持随机访问(下标),但可以重新定义大小,尾部添加内容比较方便,但在开头或者中间插入或删除比较耗时。
QLinkedList 链表容器,可以存储在不连续的空间,但不支持随机访问,插入或删除时间相对固定。
QList 连续容器,支持随机访问,插入或者删除速度比较快(两端添加或移除数据更快),是最常用的类型。
QQueue 队列容器,支持enqueue,dequeue,head操作;
QStack 堆栈容器,后进先出,支持pop,push,top操作

连续容器在多次插入和删除后,可能会产生无法获取连续空间的问题

QMap<K,T>
QHash<K,T>

QStringList 相当于 QList
QArrayByte 字节容器

- 阅读全文 -

QT5开发笔记(20)--鼠标事件


鼠标事件:

/// 鼠标拖动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    QString msg = QString::number(event->x()) + "," + QString::number(event->y());
    statusBar()->showMessage(msg);
}
/// 鼠标按键事件
void MainWindow::mousePressEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton)
    {
        statusBar()->showMessage(tr("左键"));
    }
    else if(event->button() == Qt::RightButton)
    {
        statusBar()->showMessage(tr("右键"));
    }
    else if(event->button() == Qt::MidButton)
    {
        statusBar()->showMessage(tr("中键"));
    }
    else
    {

    }
}
/// 鼠标松开事件响应函数
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{

}
/// 鼠标双击事件响应函数
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
}

}

void MainWindow::wheelEvent(QWheelEvent *event)
{
    statusBar()->showMessage("滚轮事件" + QString::number(event->delta()));
}

- 阅读全文 -

QT5开发笔记(19)--基于QCustomPlot绘图


添加源文件至工程:

# 添加printsupport(qcustomplot依赖)
QT += printsupport

SOURCES += main.cpp\
           mainwindow.cpp \
           qcustomplot.cpp

HEADERS  += mainwindow.h \
            qcustomplot.h

添加一个QWidget控件,提升为QCustomPlot


画一条曲线:

  // 添加一幅图数据(可以添加多个)
  customPlot->addGraph();
  // 设置X轴及Y轴标签
  customPlot->xAxis->setLabel("x");
  customPlot->yAxis->setLabel("y");
  // 设置X轴与Y轴的范围
  customPlot->xAxis->setRange(-1, 1);
  customPlot->yAxis->setRange(0, 1);
  //设置画笔颜色
  customPlot->graph(0)->setPen(QPen(Qt::blue));


  QVector<double> x(101), y(101); 
  for (int i=0; i<101; i++)
  {
    x[i] = i/50.0 - 1; // 设置X轴(-1 to 1)
    y[i] = x[i]*x[i];  // 设置Y轴数据
  }
  // 设置图像数据(以下标区分)
  customPlot->graph(0)->setData(x, y);  
  // 数据更新完,需要刷新显示
  customPlot->replot();

追加数据:

customPlot->graph(0)->addData(x, y);
    

使能拖拽,缩放

customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);

customPlot->setInteraction(QCP::iRangeDrag, true); // 鼠标单击拖动,第二个缺省参数为使能标志
customPlot->setInteraction(QCP::iRangeZoom, true); // 滚轮滑动缩放

动态设置范围:

// 第1个参数表示指定的基准坐标
// 第2个参数表示范围,可以通过这个参数来进行缩放操作
// 第3个参数表示对齐方式
customPlot->xAxis->setRange(x.last(), 10, Qt::AlignRight)

设置数据范围: 否则一直addData会导致内存耗尽

if(x.count() > 10000)
{
    // 删除最早的数据
    x.removeFirst();    
    y.removeFirst();
}
x.append(xPos);
y.append(xPos);

设置背景颜色:

// RGBA(A值会显示拖影)
customPlot->setBackground(QBrush(QColor(64,64,64,255)));

// 设置渐变背景
QLinearGradient plotGradient;
plotGradient.setStart(0, 0);
plotGradient.setFinalStop(0, 350);
plotGradient.setColorAt(0, QColor(80, 80, 80));
plotGradient.setColorAt(1, QColor(50, 50, 50));
ustomPlot->setBackground(plotGradient);
// 设置标签颜色   
customPlot->xAxis->setLabelColor(QColor(255, 255, 255));
// 设置坐标颜色
customPlot->xAxis->setTickLabelColor(QColor(0, 255, 0));

禁止Y轴缩放: 实际上是设置缩放范围时,不使能竖直方向即可

customPlot->axisRect()->setRangeZoom(Qt::Horizontal);

设置线条格式: 火柴棒/棒棒糖图

// 设置线型:中心点垂直向下
customPlot->graph(0)->setLineStyle((QCPGraph::lsImpulse)); 
// 设置数据点样式: 圆圈(尺寸为8)
customPlot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 8));

lsImpulse 从数据点垂直向下画线
lsLine 平滑连接各点,
lsStepLeft 在台阶左侧,
lsStepRight 在台阶右侧,
lsStepCenter 在台阶中央

显示柱状图: 将QPen的宽度设置为期望的值,线型选择lsImpulse即可;


保存图片:

customPlot->savePng("customPlot.png", 400, 300);

显示/隐藏曲线:

customPlot->graph(1)->setVisible(false);

鼠标事件:

在主窗口中声明槽函数并连接

connect(ui->customPlot, SIGNAL(mousePress(QMouseEvent*)), this, SLOT(mousePress(QMouseEvent*)));
connect(ui->customPlot, SIGNAL(mouseMove(QMouseEvent*)),  this, SLOT(mouseMove(QMouseEvent*)));
void MainWindow::mouseMove(QMouseEvent* event)
{
    /// 显示鼠标处的值
    float x_val = ui->customPlot->xAxis->pixelToCoord( event->pos().x());
    float y_val = ui->customPlot->graph(0)->data()->at(x_val)->value;
    QString msg = QString::number(x_val) + "," + QString::number(y_val);
    statusBar()->showMessage(msg);
}

设置光标模式:

ui->customPlot->setCursor(QCursor(Qt::CrossCursor));

设置游标:

QCPItemTracer* tracer;
//生成游标
tracer = new QCPItemTracer(ui->customPlot); // 生成游标
tracer->setPen(QPen(Qt::white));            // 轮廓颜色
tracer->setBrush(QBrush(Qt::white));        // 内色
tracer->setStyle(QCPItemTracer::tsPlus);    // 样式
tracer->setSize(20);                        // 设置大小

// 设置游标位置(在mouseMove事件中)  

if(ui->customPlot->graph(1)->dataCount() > 0)
{     
    x_val = ui->customPlot->xAxis->pixelToCoord( event->pos().x());   
    y_val = tracer->position->value();          /// 取出Y值
    
    tracer->setGraph(ui->customPlot->graph(1)); /// 设置游标吸附曲线     
    tracer->setGraphKey(x_val);                 /// 设置游标的X值(关键代码)
    
    /// 或者 tracer->position->setCoords(x_val, y_val);    
}

ui->customPlot->replot();    /// 刷新显示

设置光标跟随文本:

QCPItemText* tracerLabel;
tracerLabel = new QCPItemText(ui->customPlot);
tracerLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignLeft);//文字布局:顶、左对齐
///textLabel->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位)
tracerLabel->position->setType(QCPItemPosition::ptPlotCoords);
tracerLabel->setFont(QFont(font().family(), 8));  //字体大小
tracerLabel->setColor(Qt::white);                 //字体颜色
tracerLabel->setPen(QPen(Qt::white));             //外框颜色(不设置为透明色)
tracerLabel->setBrush(Qt::white);                 //填充颜色(不设置为透明色)
tracerLabel->setPadding(QMargins(2,2,2,2));       //文字距离边框几个像素    

隐藏栅格: 只需设置画笔即可

ui->customPlot->xAxis->grid()->setPen(QPen(Qt::NoPen));
ui->customPlot->yAxis->grid()->setPen(QPen(Qt::NoPen));

设置时间轴为X轴:

/// 时间轴(日-时-分-秒-毫秒)
QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime);
timeTicker->setTimeFormat("%d.%h:%m:%s.%z");
ui->customPlot->xAxis->setTicker(timeTicker);

/// 日期轴(年月日时分秒毫秒),格式可参考QDateTime::fromString()函数
QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
dateTicker->setDateTimeFormat("yy-MM-dd hh:mm:ss");
ui->customPlot->xAxis->setTicker(dateTicker);

- 阅读全文 -

QT5开发笔记(十八)--多媒体视频


添加多媒体支持: 修改.pro文件,添加以下内容:

QT += multimedia
QT += multimediawidgets

在窗体中添加widget控件,并提升为QVideoWidget,用于显示;


播放avi文件:

#include <QMediaPlayer>
#include <QVideoWidget>
// 设置媒体
media->setMedia(QUrl::fromLocalFile("蜡笔小新.avi"));
// 设置视频输出位置
media->setVideoOutput(ui->widget);
media->setVolume(50);
// 播放
media->play();

仅能用于播放avi不需要解码的文件。


- 阅读全文 -


Copyright©2024 春天花会开, All Rights Reserved. Email: webmaster@oroct.com