代码如下:
// CUDA support
if (1)
{
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
}
// [4]载入理图像
cv::Mat frame;
cv::Mat inputBlob;
double timer = 0;
if (1)
{
// frame = QImage2Mat(m_image); //图像
frame = cv::imread(m_imagestr.toStdString().c_str());
if(frame.empty()){
qDebug()<<"图片打开失败";
return;
}
qDebug()<<"sendImage1";
inputBlob = cv::dnn::blobFromImage(frame, 1.0 / 255, cv::Size(608,608), cv::Scalar());
net.setInput(inputBlob);
qDebug()<<"sendImage2";
// 启动计时器
timer = (double)cv::getTickCount();
qDebug()<<"sendImage3";
// [5] 模型推理 获取未连接输出层
std::vector<cv::String> outNames = net.getUnconnectedOutLayersNames();
qDebug()<<"sendImage4";
std::vector<cv::Mat> outs;
qDebug()<<"sendImage5"<<outNames.size();
if(outNames.size()!=3){
qDebug()<<"图片通道数不是3的倍数";
return;
}
// 前向传播
net.forward(outs, outNames);
qDebug()<<"sendImage5";
// 计算耗时:
t = ((double)cv::getTickCount() - timer) / cv::getTickFrequency(); //获得时间,单位是秒;
string label = cv::format("YOLO v4");
cv::putText(frame, label, cv::Point(15, 15), cv::FONT_HERSHEY_COMPLEX, 0.5, cv::Scalar(0, 0, 255));
qDebug()<<"sendImage3";
// [6]结果后处理
vector<cv::Rect> boxes;
vector<int> classIds;
vector<int> indices;
qDebug()<<"postProcess1";
postProcess(net, frame, outs, boxes, classIds, indices, confidenceThreshold, nmsThreshold);
qDebug()<<"postProcess2";
// [7]绘制显示结果
drawPred(frame, boxes, classIds, indices, classNamesVec);
QImage t_image = cvMat2QImage(frame);
emit sendImage(t_image);
qDebug()<<"sendImage"<<t_image.width();
}