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