opencv 实现实时检测,求大神帮忙
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 实现实时检测,求大神帮忙相关的知识,希望对你有一定的参考价值。
#include "StdAfx.h"
#include<cv.h>
#include<highgui.h>
#include<iostream>
// #pragma comment(lib, "cv.lib")
// #pragma comment(lib, "cxcore.lib")
// #pragma comment(lib, "highgui.lib")
using namespace std;
using namespace cv;
int main(int argc,char* argv)
CvCapture* capture1 = cvCreateCameraCapture(0);
double w=640,h=480;
//cvNamedWindow("camera_1",CV_WINDOW_AUTOSIZE);
cvSetCaptureProperty(capture1,CV_CAP_PROP_FPS,5);
IplImage* pImgSrc = NULL; //源图像
IplImage* pImg8u = NULL; //灰度图
IplImage* pImgCanny = NULL; //边缘检测后的图
IplImage* pImgDst = NULL; //在图像上画上检测到的直线后的图像
CvSeq* lines = NULL;
CvMemStorage* storage = NULL;
while(1)
pImgSrc=cvQueryFrame(capture1);
pImg8u = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 1);
pImgCanny = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 1);
pImgDst = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 1);
// Get one frame
IplImage* frame = cvQueryFrame( capture );
if( !frame )
fprintf( stderr, "ERROR: frame is null...\n" );
getchar();
break;
cvCvtColor (pImgSrc, pImg8u, CV_BGR2GRAY);
cvCanny (pImg8u, pImgCanny, 20, 200, 3);
/*检测直线*/
storage = cvCreateMemStorage (0);
lines = cvHoughLines2 (pImgCanny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 200, 10);
pImgDst = cvCreateImage (cvGetSize(pImgSrc), IPL_DEPTH_8U, 3);
cvCvtColor (pImg8u, pImgDst, CV_GRAY2BGR);
/*在pImgDst上画出检测到的直线*/
for (int i = 0; i < lines->total; i++)
CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i);
cvLine (pImgDst, line[0], line[1], CV_RGB(255,0,0), 3, 8);
//cvNamedWindow ("src",1);
//cvNamedWindow ("canny", 1);
//cvNamedWindow ("hough", 1);
cvShowImage ("src", pImgSrc);
cvShowImage ("canny", pImgCanny);
cvShowImage ("hough", pImgDst);
cvWaitKey (0);
cvReleaseImage (&pImgSrc);
cvReleaseImage (&pImg8u);
cvReleaseImage (&pImgCanny);
cvReleaseImage (&pImgDst);
cvReleaseMemStorage (&storage);
return 0;
opencv初学者
以上代码是网上找的,在使用的时候,必须要按回车,才能显示下一帧的图片。这样不连贯。
请问要如何修改什么地方,才能将成为实时处理呢?就是不用按任何键,程序能实时检测。
我改成if( (cvWaitKey(10) & 255) == 27 ) break;了 效果好了很多
请问你知道如何将画面分区么?就是说把窗口分为左中右三部分,分别处理不同的(例如左边处理直线,中间处理圆……)
你好,去掉以后 ,一开始程序,就死机了……三个窗口也是灰色的,请问是什么情况呢?
刷新不过来导致的,因为你要实时看效果,而刷新的速度比较慢,采集的速度比较快,两者不同步。建议你还是保存图像吧,或者选用低分辨率的图像。
追问我改成if( (cvWaitKey(10) & 255) == 27 ) break;了 效果好了很多
请问你知道如何将画面分区么?就是说把窗口分为左中右三部分,分别处理不同的(例如左边处理直线,中间处理圆……)
不明白你的意思,窗口显示是可以设置有固定大小和位置的吧。void cvMoveWindow( const char* name, int x, int y );
name
将被设置的窗口的名字。
x
窗口左上角的x坐标。
y
窗口左上角的y坐标。
函数cvMoveWindow改变窗口的位置。
截取画面的问题解决了……我用的cvSetImageROI 谢谢你啦
本回答被提问者和网友采纳OpenCV+OpenVINO实现人脸Landmarks实时检测
关注获取更多计算机视觉与深度学习知识
缘由
自从OpenCV3.3版本引入深度神经网络(DNN)模块之后,OpenCV对DNN模块支持最好的表现之一就是开始支持基于深度学习人脸检测,OpenCV本身提供了两个模型分别是基于Caffe与Tensorflow的,Caffe版本的模型是半精度16位的,tensorflow版本的模型是8位量化的。同时OpenCV通过与OpenVINO IE模型集成实现了底层硬件对对象检测、图像分割、图像分类等常见模型加速推理支持。OpenVINO框架本身提供直接快速开发应用原型的模型库,对很多常见视觉任务都可以做到快速演示支持。说起人脸的Lankmarks提取,最早的OpenCV跟DLib支持的方式都是基于AAM算法实现的68个人脸特征点的拟合模型,另外OpenCV中支持landmark的人脸检测会先加载一个很大的模型文件,然后速度感人,觉得还有很大的改进空间。好处是OpenCV自己提供了一个训练工具,可以自己训练模型。常见的MTCNN同时实现了人脸检测跟landmarks检测,但是只支持5点检测。而OpenVINO自带的Landmark检测模型基于自定义的卷积神经网络实现,取35个人脸各部位关键点。
模型文件
人脸检测模型
使用OpenCV DNN模块人脸检测的tensorflow量化8位模型
opencv_face_detector_uint8.pb权重文件
opencv_face_detector.pbtxt配置文件
OpenCV3.3以上版本支持
Landmarks检测
模型名称:facial-landmarks-35-adas-0002
支持35点分布表示出左眼、右眼、鼻子、嘴巴、左侧眉毛、右侧眉毛、人脸轮廓。模型的输入格式为:
BCHW = [1x3x60x60]
模型的输出数据为:[1x70]大小的浮点数组、对应到35个点x、y的坐标。
输出层名称:align_fc3
程序演示
首先加载模型文件
// 加载LANDMARK
Net mkNet = readNetFromModelOptimizer(landmark_xml, landmark_bin);
mkNet.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
mkNet.setPreferableTarget(DNN_TARGET_CPU);
// 加载网络
Net net = cv::dnn::readNetFromTensorflow(tensorflowWeightFile, tensorflowConfigFile);
net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
net.setPreferableTarget(DNN_TARGET_CPU);
使用网络实现人脸检测与landmark检测
首先读取视频的每一帧,检测人脸,得到的人脸区域转换位blob对象之后,再调用landmark检测模型forward方法得到输出结果,实现的代码如下:
Mat frame;
while (true) {
bool ret = cap.read(frame);
if (!ret) {
break;
}
// flip(frame, frame, 1);
cv::Mat inputBlob = cv::dnn::blobFromImage(frame, 1.0, cv::Size(300, 300),
Scalar(104.0, 177.0, 123.0), false, false);
net.setInput(inputBlob, "data");
cv::Mat detection = net.forward("detection_out");
cv::Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());
for (int i = 0; i < detectionMat.rows; i++)
{
float confidence = detectionMat.at<float>(i, 2);
if (confidence > 0.5)
{
int x1 = static_cast<int>(detectionMat.at<float>(i, 3) * w);
int y1 = static_cast<int>(detectionMat.at<float>(i, 4) * h);
int x2 = static_cast<int>(detectionMat.at<float>(i, 5) * w);
int y2 = static_cast<int>(detectionMat.at<float>(i, 6) * h);
Mat roi = frame(Range(y1, y2), Range(x1, x2));
Mat blob = blobFromImage(roi, 1.0, Size(60, 60), Scalar(), false, false);
mkNet.setInput(blob);
Mat landmark_data = mkNet.forward();
// printf("rows: %d \n, cols : %d \n", landmark_data.rows, landmark_data.cols);
for (int i = 0; i < landmark_data.cols; i += 2) {
float x = landmark_data.at<float>(0, i)*roi.cols+x1;
float y = landmark_data.at<float>(0, i + 1)*roi.rows+y1;
// mkList.push_back(Point(x, y));
circle(frame, Point(x, y), 2, Scalar(0, 0, 255), 2, 8, 0);
}
cv::rectangle(frame, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(0, 255, 0), 2, 8);
}
}
imshow("Face-Detection Demo", frame);
char c = waitKey(1);
if (c == 27) {
break;
}
}
运行结果如下:
至于速度,我只能告诉你很实时,我是i7 CPU。
想尝试下载与使用OpenVINO直接从下面链接即可开始:
https://software.intel.com/en-us/openvino-toolkit/choose-download?innovator=CONT-0026250
推荐阅读
以上是关于opencv 实现实时检测,求大神帮忙的主要内容,如果未能解决你的问题,请参考以下文章
牛逼!大神用OpenCV/Keras/TensorFlow实现口罩检测
OpenCV+OpenVINO实现人脸Landmarks实时检测
OpenCV+OpenVINO实现人脸Landmarks实时检测