简单的QImage工程
通常,QImage 类用于加载图像文件,并操作图像数据。在屏幕上进行显示时,需要先将 QImage 对象转成 QPixmap 对象。
相关的完整工程在这边: QT 自主选择路径,并加载出图片. (没有设置积分要求哦)
OpenCV打开摄像头 Qt工程
理论基础
完整工程
相关的完整工程在这边: QT + OpenCV 打开摄像头. (没有设置积分要求哦)
OpenCV行人检测 Qt工程
理论基础
行人检测算法使用的是HOG算子特征提取+SVM分类器训练,相关的原理阐述和参数分析参考如下:
HOG特征.
HOG特征与行人检测.
行人检测任务之HOG算子.
HOG detectMultiScale 参数分析.
行人检测 图像
void MainWindow::imgPedestrianDetect()
{
// 显示原始图像
imgInput = cv::imread("Pedestrian.png");
cv::cvtColor(imgInput, imgInput, cv::COLOR_BGR2RGB);
QImage imageInput = QImage((uchar*)(imgInput.data),imgInput.cols,imgInput.rows,imgInput.step,QImage::Format_RGB888);
ui -> imgInputLabel ->setPixmap(QPixmap::fromImage(imageInput));
// HOG 行人检测
hog = cv::HOGDescriptor();
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
std::vector<cv::Rect> pedestrian;
cv::Size winStride = cv::Size(4, 4);
cv::Size padding = cv::Size(8, 8);
hog.detectMultiScale(imgInput, pedestrian, 0, winStride, padding, 1.25);
// 框出检测目标
for(std::vector<cv::Rect>::const_iterator r = pedestrian.begin(); r != pedestrian.end(); r++)
{
cv::Rect rect(0, 0, 0, 0);
rect.x = int(r->x);
rect.y = int(r->y);
rect.width = int(r->width - 1);
rect.height = int(r->height - 1);
cv::rectangle(imgInput, rect, cv::Scalar(0, 255, 0), 3);
}
// 显示输出图像
QImage imageOutput = QImage((uchar*)(imgInput.data),imgInput.cols,imgInput.rows,imgInput.step,QImage::Format_RGB888);
ui -> imgOutputLabel ->setPixmap(QPixmap::fromImage(imageOutput));
}
行人检测 视频
void MainWindow::videoPedestrianDetect()
{
double time_Start = (double)clock();
CvCapture->read(imgInput);
// 显示原始图像
cv::cvtColor(imgInput, imgInput, cv::COLOR_BGR2RGB);
QImage imageInput = QImage((uchar*)(imgInput.data),imgInput.cols,imgInput.rows,imgInput.step,QImage::Format_RGB888);
ui -> imgInputLabel ->setPixmap(QPixmap::fromImage(imageInput));
// HOG 行人检测
hog = cv::HOGDescriptor();
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
std::vector<cv::Rect> pedestrian;
cv::Size winStride = cv::Size(4, 4);
cv::Size padding = cv::Size(8, 8);
hog.detectMultiScale(imgInput, pedestrian, 0, winStride, padding, 1.25);
// 框出检测目标
for(std::vector<cv::Rect>::const_iterator r = pedestrian.begin(); r != pedestrian.end(); r++)
{
cv::Rect rect(0, 0, 0, 0);
rect.x = int(r->x);
rect.y = int(r->y);
rect.width = int(r->width - 1);
rect.height = int(r->height - 1);
cv::rectangle(imgInput, rect, cv::Scalar(0, 255, 0), 3);
}
// 显示输出图像
QImage imageOutput = QImage((uchar*)(imgInput.data),imgInput.cols,imgInput.rows,imgInput.step,QImage::Format_RGB888);
ui -> imgOutputLabel ->setPixmap(QPixmap::fromImage(imageOutput));
double time_End = (double)clock();
qDebug()<<"程序耗时:"<<(time_End - time_Start)<<"ms";//输出计时
}