Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 不同形状的检测';相机的动态图像(圆形、方形和矩形)?_Android_Ios_Opencv_Augmented Reality_Metaio - Fatal编程技术网

Android 不同形状的检测';相机的动态图像(圆形、方形和矩形)?

Android 不同形状的检测';相机的动态图像(圆形、方形和矩形)?,android,ios,opencv,augmented-reality,metaio,Android,Ios,Opencv,Augmented Reality,Metaio,我想创建一个应用程序来检测对象的形状,如(仅圆形、方形和矩形的几何图形),该应用程序不应使用无标记或基于边的方法来检测扩展中的形状 为此,我使用了以下内容,例如,我已经完成了metaio sdk中已经存在的教程过程 1) 梅塔奥: 2) OpenCV: 这些就是我试图实现的东西 几何图形: 1) 实时循环可以是任何循环对象--> 2) 实时正方形可以是任何正方形对象--> 3) 实时矩形可以是任何矩形对象--> 我怎样才能实现这种增强的场景呢 提前感谢更新:这篇StackOverflow帖

我想创建一个应用程序来检测对象的形状,如(仅圆形、方形和矩形的几何图形),该应用程序不应使用无标记基于边的方法来检测扩展中的形状

为此,我使用了以下内容,例如,我已经完成了metaio sdk中已经存在的教程过程

1) 梅塔奥:

2) OpenCV:

这些就是我试图实现的东西

几何图形: 1) 实时循环可以是任何循环对象-->

2) 实时正方形可以是任何正方形对象-->

3) 实时矩形可以是任何矩形对象-->

我怎样才能实现这种增强的场景呢


提前感谢

更新:这篇StackOverflow帖子(包括一些不错的示例图片)似乎至少解决了您问题的-部分。他所指的优秀作品的参考资料可以在这本书上找到(不幸的是,只能通过回程机器找到)

如果这两个选项都不成立,请参阅相关部分:

检测图像:

要检测图像中的圆,需要注意一些微妙的细节。在使用圆检测功能
cvHoughCircles
处理图像之前,您可能希望首先将其转换为灰色图像并对其进行平滑处理。以下是需要使用的函数的一般过程及其用法示例

创建图像

假设您有一个名为“img”的初始图像进行处理,首先您希望使用
cvCreateImage
创建一个名为“gray”的图像变量,其尺寸与img相同

IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 ); 
                 // allocate a 1 channel byte image

CvMemStorage* storage = cvCreateMemStorage(0);


IplImage* cvCreateImage(CvSize size, int depth, int channels);

  size:  cvSize(width,height);

  depth: pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
    IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F

  channels: Number of channels per pixel. Can be 1, 2, 3 or 4. The channels 
    are interleaved. The usual data layout of a color image is
    b0 g0 r0 b1 g1 r1 ...
转换为灰色

现在,您需要使用在颜色空间之间转换的
cvtcolor
将其转换为灰色

cvCvtColor( img, gray, CV_BGR2GRAY );

cvCvtColor(src,dst,code); // src -> dst

  code    = CV_<X>2<Y>
  <X>/<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab
src

  • 源图像
dst

  • 目标图像
平滑类型

平滑的类型:

  • CV_BLUR_NO_SCALE(无缩放的简单模糊)-像素param1×param2邻域上的总和。如果邻域大小不固定,可以使用CVF积分函数
  • CV_模糊(简单模糊)-在像素param1×param2邻域上求和,随后按1/(param1•param2)缩放
  • CV_GAUSSIAN(高斯模糊)-使用param1×param2 GAUSSIAN卷积图像
  • CV_中值(中值模糊)-查找param1×param1邻域的中值(即邻域为正方形)
  • CV_双边(双边过滤器)-使用
    color sigma=param1
    space sigma=param2
参数1

  • 平滑操作的第一个参数
param2

  • 平滑运算的第二个参数
对于简单缩放/非缩放和高斯模糊,如果
param2
为零,则设置为
param1

使用Hough圆检测

函数
cvHoughCircles
用于检测灰度图像上的圆。最后两个参数可能还需要修改

CvSeq* circles = 
 cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );


CvSeq* cvHoughCircles( CvArr* image, void* circle_storage,
                       int method, double dp, double min_dist,
                       double param1=100, double param2=100,
                       int min_radius=0, int max_radius=0 );
============================

该wiki页面的其余部分实际上非常好(尽管,我不打算在这里重新复制它,因为其余部分与原始问题无关,并且StackOverflow对答案有大小限制)。希望Wayback机器上的缓存副本能够无限期地继续工作

更新之前的回答:

太好了!现在你已经发布了一些示例,我可以看到你不仅关注矩形、方形矩形和圆形,你还希望在3D环境中找到这些形状,从而潜在地寻找平行四边形和椭圆形的特殊情况,从一个视频帧到另一个视频帧最终可以显示它们自己是矩形、正方形,和/或圆(取决于您平移相机的方式)

就我个人而言,我发现自己解决一个问题比试图理解如何使用一个现有的(通常是非常成熟的)库更容易。这并不是说我自己的作品会比一个成熟的图书馆更好,当然不会。只是,一旦我能自己解决一个问题,我就更容易理解和使用一个库(库本身通常比我自己的解决方案运行得更快、更智能)

所以下一步我要做的是将位图的颜色空间更改为灰度。一个彩色位图,我很难理解,也很难操作,特别是因为它有很多不同的表示方式,但是一个灰度位图,这两者都更容易理解和操作。对于灰度位图,只需想象一个值网格,每个值具有不同的光强度

现在,让我们把问题的范围限制在在静态2D环境中寻找平行四边形和椭圆形(我们以后会担心处理3D环境和移动视频帧,或者我应该说,你自己会担心这一部分,因为这个问题对我来说已经太复杂了)

现在,我们也不用担心您使用什么工具或语言。只要使用最简单和最快速的方法。例如,假设时间没有问题,几乎任何东西都可以编写脚本来自动将图像转换为灰度。ImageMagick、Gimp、Python、Ruby、Java等

使用这些工具中的任何一种,都应该能够轻松地将具有足够相似强度的像素分组(以使计算更易于管理),并将每个像素坐标排序到不同的数组中,以便于计算
CvSeq* circles = 
 cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );


CvSeq* cvHoughCircles( CvArr* image, void* circle_storage,
                       int method, double dp, double min_dist,
                       double param1=100, double param2=100,
                       int min_radius=0, int max_radius=0 );