- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个形状检测程序,该程序将在遥控飞机上飞行时检测地面上的形状。问题是程序不是很准确。它会偶尔找到一个形状,但不会始终如一。我已经尝试过 HSV 过滤和 Canny 阈值处理,但它们似乎并没有像我使用它们的方式那样工作。有什么方法可以改进还是我的方法完全失效了?
我已经包含了我一直在测试它的东西的图像。
应该在此窗口上勾勒出形状 -->
在此窗口中可以看到阈值图像 -->
我一直在搞乱的代码就在这里
//include section
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <math.h>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
//finds the angles for shape detection Status: Good to go
double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 );
//This is for color filtering Status: Doesn't Work Yet
IplImage* GetThresholdedImage(IplImage* imgHSV);
// flag definitions 1: HSV color filtering; 2: Canny Edge Detect; 3: HSV Filter with canny filtering;
////Change these values to get what you need
int flag = 1;
//These values change the HSV filtering values.
int Hue_Min = 112;
int Hue_Max = 251;
int Saturation_Min = 0;
int Saturation_Max = 256;
int Value_Min = 38;
int Value_Max = 218;
int main()
{
//Make the windows
cvNamedWindow("Thresholded",CV_WINDOW_NORMAL);
cvNamedWindow("Tracked",CV_WINDOW_NORMAL);
cvNamedWindow("Original",CV_WINDOW_NORMAL);
//Gets stuff from camera
CvCapture* capture = cvCaptureFromCAM(0);
//This variable will hold all the frames. It will hold only one frame on each iteration of the loop.
IplImage* frame;
while(1)
{
//Gets Frame from camera
std::cout << "frame capture\n";
frame = cvQueryFrame(capture);
std::cout << "Check\n";
//puts the original image in the window
cvShowImage("Original",frame);
std::cout << "declare imgGrayScale\n";
IplImage* imgGrayScale;
std::cout << "check\n";
//Use the Pyramid thing rob has been working on here
//
//cvSmooth( frame, frame, CV_GAUSSIAN, 5, 5 );
if(flag ==1){
//Filter unwanted colors out
std::cout << "HSV Flag Active\n";
std::cout << "HSV Color Filter\n";
imgGrayScale = GetThresholdedImage(frame);
std::cout << "Check\n";
}
if(flag ==2)
{
std::cout << "Grayscale HSV Flag Active\n";
//Making a single channel matrix so that edge detection can work properly
std::cout << "Grayscale Image\n";
imgGrayScale = cvCreateImage(cvGetSize(frame), 8, 1);
cvCvtColor(frame,imgGrayScale,CV_BGR2GRAY);
std::cout << "Check\n";
// This thresholds the grayscale image to be tested on
std::cout << "Canny Threshold Image\n";
//cvThreshold(imgGrayScale,imgGrayScale,100,255,CV_THRESH_BINARY | CV_THRESH_OTSU);
cvCanny( imgGrayScale, imgGrayScale, 100, 100, 3 );
std::cout << "Check\n";
}
if(flag == 3)
{
std::cout << "HSV Canny Flag Active\n";
std::cout << "HSV Color Filter\n";
imgGrayScale = GetThresholdedImage(frame);
std::cout << "Check\n";
std::cout << "Canny Threshold Image\n";
//cvThreshold(imgGrayScale,imgGrayScale,100,255,CV_THRESH_BINARY | CV_THRESH_OTSU);
cvCanny( imgGrayScale, imgGrayScale, 100, 100, 3 );
std::cout << "Check\n";
}
std::cout << "Contour Allocation\n";
CvSeq* contours; //hold the pointer to a contour in the memory block
CvSeq* result; //hold sequence of points of a contour
CvMemStorage *storage = cvCreateMemStorage(0); //storage area for all contours
std::cout << "Check\n";
std::cout << "Find Contours\n";
//finding all contours in the image
cvFindContours(imgGrayScale, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
std::cout << "Check\n";
while(contours){
//obtain a sequence of points of contour, pointed by the variable 'contour'
result = cvApproxPoly(contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0);
//Triangle Detection
//if there are 3 vertices in the contour(It should be a triangle)
if(result->total==3 )
{
//iterating through each point
CvPoint *pt[3];
for(int i=0;i<3;i++){
pt[i] = (CvPoint*)cvGetSeqElem(result, i);
}
//This If Statement ensures that the edges are sufficiently large enough to be detected
if(abs(pt[1]->x - pt[0]->x)>10 && abs(pt[1]->x - pt[2]->x)>10 && abs(pt[2]->x - pt[0]->x)>10){
//////////drawing lines around the triangle
cvLine(frame, *pt[0], *pt[1], cvScalar(255,0,0),4);
cvLine(frame, *pt[1], *pt[2], cvScalar(255,0,0),4);
cvLine(frame, *pt[2], *pt[0], cvScalar(255,0,0),4);
std::cout << "\nTriangle\n";
}
}
//Rectangle detection
//if there are 4 vertices in the contour(It should be a quadrilateral)
else if(result->total==4 )
{
//iterating through each point
CvPoint *pt[4];
for(int i=0;i<4;i++){
pt[i] = (CvPoint*)cvGetSeqElem(result, i);
}
//finding angles
double firstAngle = acos(angle( pt[0],pt[2],pt[1] ));
double secondAngle = acos(angle(pt[1],pt[3],pt[2]));
double thirdAngle = acos(angle(pt[1],pt[3],pt[2]));
double fourthAngle = acos(angle(pt[0],pt[2],pt[3]));
//This If Statement Ensures that the edges are sufficiently large
if(abs(pt[1]->x - pt[0]->x)>10 && abs(pt[1]->x - pt[2]->x)>10 && abs(pt[2]->x - pt[3]->x)>10 && abs(pt[3]->x - pt[0]->x)>10){
//This if statement checks the angles to see if its a rectangle or not (90 angles with 10% uncertainty)
if(firstAngle <= 1.884 && firstAngle >= 1.308 && secondAngle <= 1.884 && secondAngle >= 1.308 && thirdAngle <= 1.884 && thirdAngle >= 1.308 && fourthAngle <= 1.884 && fourthAngle >= 1.308 )
{
//drawing lines around the quadrilateral
cvLine(frame, *pt[0], *pt[1], cvScalar(0,255,0),4);
cvLine(frame, *pt[1], *pt[2], cvScalar(0,255,0),4);
cvLine(frame, *pt[2], *pt[3], cvScalar(0,255,0),4);
cvLine(frame, *pt[3], *pt[0], cvScalar(0,255,0),4);
std::cout << "\nsquare\n" ;
//cout << firstAngle; //Uncomment this to get the angles that its detecting.
}
}
}
contours = contours->h_next;
}
//Put the images in the frame
cvShowImage("Tracked",frame);
cvShowImage("Thresholded",imgGrayScale);
char c = cvWaitKey(33);
if(c==27)
{
//cleaning up
cvDestroyAllWindows();
cvReleaseImage(&frame);
cvReleaseImage(&imgGrayScale);
cvReleaseMemStorage(&storage);
break;
}
//for(int i=1;i<100000000/5;i++);
cvReleaseImage(&imgGrayScale);
cvReleaseMemStorage(&storage);
}
return 0;
}
IplImage* GetThresholdedImage(IplImage* imgHSV){
IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U,1);
cvInRangeS(imgHSV, cvScalar(Hue_Min,Saturation_Min,Value_Min), cvScalar(Hue_Max,Saturation_Max,Value_Max), imgThresh);
return imgThresh;
}
double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 )
{
double dx1 = pt1->x - pt0->x;
double dy1 = pt1->y - pt0->y;
double dx2 = pt2->x - pt0->x;
double dy2 = pt2->y - pt0->y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}
最佳答案
一般来说,为了提取同质区域,已知 MSER(最大稳定极值区域)效果很好,它在 OCR 中被广泛使用,并且您显示的图像似乎也具有相同的属性,同质颜色区域,然后是字母在他们里面。还有一个可用的 openCV 实现。
http://en.wikipedia.org/wiki/Maximally_stable_extremal_regions
关于c++ - 如何改进视频流中的形状检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232969/
我正在用 symfony2 编写应用程序,但我遇到了视频流问题。 如果一个 Action 需要很长时间才能执行 - 例如 1 分钟,整个应用程序将被卡住(当在第二个选项卡中打开时)并且必须等待该执行结
我正在用 symfony2 编写应用程序,但我遇到了视频流问题。 如果一个 Action 需要很长时间才能执行 - 例如 1 分钟,整个应用程序将被卡住(当在第二个选项卡中打开时)并且必须等待该执行结
我正在尝试用视频流做一个应用程序,现在我只能从服务器向客户端发送一张图像。当我尝试在客户端发送不止一张图像时,我收到以下错误:“参数无效。”在 pictureBox1.Image = new Bitm
我正在使用 mediaViews 和 html5 在我们的 cakephp 网站上流式传输视频截屏。我正在为播放器使用 videojs,但遇到了一些问题: 不会在 safari/ipad/iphone
我已经安装了fluent-ffmpeg和ffmpeg-static以将流转换为HTML可复制的视频。如何使用这些软件包在客户端中显示流? 服务器端( main.js ): const { app, B
我在我的应用程序中实现了 TTS(文本转语音)功能。一切都很顺利,但现在我遇到了一个无法找到解决方案的问题。 基本上,我在激活 TTS 功能之前获得音频焦点。在实际的应用程序中,当我这样做时音乐就会停
我已经执行了开源社区链接发布的 AudioPlayer.java 示例 Audio Player Tutorial 我得到以下异常 Exception in thread "main" java.la
有什么方法可以在iOS原生App中通过URL播放无法下载或保存到本地的视频流。我想让用户观看视频,但他不能在本地下载或保存视频(通过第 3 方下载器应用程序)。 在 MPMoviePlayerCont
我正在开发用于网络吞吐量测试的点对点视频流。两个对等点之间的网络支持低比特率传输。 我使用 OpenCV 为视频流制作了简单的 python 程序。 该程序从网络摄像头抓取视频帧并将其编码为 JPEG
我正在我的应用程序中流式传输实时视频。我有一个 .m3u8 链接,它在 vlc 播放器中完美运行。但是当我在我的应用程序中播放这个流时,视频的可视化被破坏了(见截图)。有谁知道,这可能是什么原因造成的
好的。因此,有数十亿种不同的 Android 设备。我有一个视频流服务,非常适用于 iOS。我的应用程序具有实时视频功能和保存的视频剪辑播放功能(也可以流式传输到设备)。我在不同的 Android 设
我有一个屏幕共享应用程序 (WebRTC)。一个用户想与另一个用户共享他的屏幕。就像一个应用程序在用户 1 机器上运行而另一个应用程序在用户 2 机器上运行。用户 1 想要共享他的屏幕,现在如何在用户
我正在尝试提供即时转码的视频。不幸的是,这意味着寻求不起作用。我假设这是因为浏览器不知道视频有多长,因此无法正确显示搜索栏。 有谁知道是否可以对视频的时长进行硬编码? 我想到的另一个选择可能是创建我自
在将解复用的 h264 解码输出发送到 gstreamer 管道中的 autovideosink 之前,是否可以在两者之间提供一些延迟。如果是这样,任何人都可以发布示例管道来做到这一点。 我使用的管道
一直在把我的头发拉出来,这本来应该是一项快速而简单的任务。 我有一个自托管的 WCF 服务,我需要在其中实现实时视频转码,转码本身不是问题,使用 FFMpeg 到本地临时文件。 我的代码的快速示例;
我想在 C# 应用程序和浏览器之间建立视频流。 我使用 Websockets 进行通信。 视频源是网络摄像头。 我可以请求单个 PNG 帧,但速度太慢了。 websocket 服务器( Ratchet
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
是否可以在 lync 2010 或 2013 中捕获 lync session 的视频流?我已经在我们的实验室中运行了测试版。 UCMA 为 AudioVideoFlow 提供了钩子(Hook),但似
我有一个 ffmpeg 命令,它接收帧流并输出 ogg 视频。如何从另一个文件中添加音频? ffmpeg -f rawvideo -pix_fmt bgr24 -s WIDTHxHEIGHT -r 3
我正在使用全息镜头,并且我正在尝试保存具有可用世界/投影矩阵的视频流。我一直在尝试拍摄一系列照片并保存数据,但我找不到保存图像和矩阵的方法。 保存到磁盘时,没有获取照片捕获帧(包含矩阵数据)的选项,保
我是一名优秀的程序员,十分优秀!