android 动态矩形条,android – 从相机中动态检测不同形状(圆形,方形和矩形)?

更新:这个StackOverflow帖子(包含一些很好的样本图片)似乎至少解决了你的问题的

circles detection部分.他指出的优秀文章的参考资料可以在

wiki page上找到(不幸的是只能通过回程机器).

如果new link也没有,则以下是相关部分:

检测图像:

有一些需要注意检测图像中的圆圈的小巧位.在使用cvHoughCircles(圆形检测功能)处理图像之前,您可能希望先将其转换为灰色图像并使其平滑.以下是您需要使用的函数的一般过程及其用法示例.

创建图像

假设您有一个名为’img’的初始处理图像,首先要创建一个名为’gray’的图像变量,其尺寸与使用cvCreateImage的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 ...

转换为灰色

现在你需要使用cvCvtColor将它转换为灰色,cvCvtColor在颜色空间之间进行转换.

cvCvtColor( img, gray, CV_BGR2GRAY );

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

code = CV_2

/ = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab

流畅的图像

这样做是为了防止检测到许多假圆圈.您可能需要使用最后两个参数,注意它们需要乘以奇数.

cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 );

// smooth it, otherwise a lot of false circles may be detected

void cvSmooth( const CvArr* src, CvArr* dst,

int smoothtype=CV_GAUSSIAN,

int param1, int param2);

SRC

>源图像.

DST

>目标图像.

smoothtype

平滑的类型:

> CV_BLUR_NO_SCALE(没有缩放的简单模糊) – 像素param1×param2邻域的总和.如果邻域大小不固定,可以使用cvIntegral函数.

> CV_BLUR(简单模糊) – 在像素param1×param2邻域上求和,随后按1 /(param1•param2)缩放.

> CV_GAUSSIAN(高斯模糊) – 使用param1×param2高斯卷积图像.

> CV_MEDIAN(中位数模糊) – 找到param1×param1邻域的中值(即邻域是正方形).

> CV_BILATERAL(双边滤波器) – 应用双边3×3滤波,颜色sigma = param1和space sigma = param2

参数1

>平滑操作的第一个参数.

参数2

>平滑操作的第二个参数.

如果param2为零,则在简单缩放/非缩放和高斯模糊的情况下,将其设置为param1

使用Hough Circle检测

函数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的答案大小有限).希望link到Wayback机器上的缓存副本将继续无限期地工作.

我的更新之前的回答:

大!现在您已经发布了一些示例,我可以看到您不仅仅是在矩形,方形矩形和圆形之后,您还希望在3D环境中找到这些形状,从而可能寻找视频中的平行四边形和椭圆形的特殊情况帧到视频帧最终可以显示为矩形,正方形和/或圆形(取决于您如何平移相机).

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

因此,我将采取的下一步是将位图的颜色空间更改为灰度.一个颜色位图,我很难理解,我操作起来很麻烦,特别是因为有很多不同的方式可以表示,但是灰度位图,这更容易理解和操作.对于灰度位图,只需想象一个值网格,每个值representing具有不同的光强度.

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

而且就目前而言,我们不用担心您使用的工具或语言.只需使用最简单,最快捷的方法.例如,假设时间没有问题,几乎任何东西都可以编写脚本以自动将图像转换为灰度. ImageMagick,Gimp,Marvin,Processing,Python,Ruby,Java等.

对于任何这些工具,应该很容易将具有相似足够强度的像素分组(以使计算更易于管理),并为每个光强度桶对不同阵列中的每个像素坐标进行排序.换句话说,按照包含每个像素的x和y位置的强度排序某种粗略的阵列直方图应该不会太困难.

之后,问题变得更像this one(可以在StackOverflow上找到),因此可以使用其建议的解决方案.

一旦你能够以这种方式解决问题,那么将你提出的解决方案转换为适合任务的更好的语言应该不会太困难.并且理解和使用您最终为任务选择的任何现有库的基础功能也应该更容易.至少,这就是我所希望的,因为我不够熟悉,我无法真正帮助你自己使用OpenCV库.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值