我有一组点在图像上.这些点形成不规则的闭合形状.我需要找到这个形状的区域.是否有任何身体是用于计算面积的常规算法?或者在诸如boost之类的库中是否有任何支持?我正在使用C++.
我们有一个由连接器和段组成的数据集.每个段都有两个连接器,但每个连接器可以属于零个或多个段(即左侧图像中的连接器"A"没有段,而连接器"M"有三个,MR,ML和MN.)
可以理解,只要任何线条相交或相交,就会有连接器,因此我们不必担心偶数/奇数规则,重叠或部分封闭的多边形等,因为它们不适用.
简而言之,我们试图识别所有创建的多边形(右图中的彩色形状).我相信这可以分两步完成.
第1部分:删除多余的物品
独立连接器(这里的连接器'A')可以简单地移除,因为它们不能成为形状轮廓的一部分.
引用单个段(连接器"B"和"E")的浮动端点也可以被移除,因为它们也不能成为形状轮廓的一部分.这也将删除他们引用的段(BC和ED).
递归地执行上述操作将接下来将'C'识别为端点(因为'B'和BC已被移除),因此它和它的剩余段CD也可以被移除.在下一个递归传递中,连接器"D"和段DF也将被移除,等等.
但是,我还没有找到识别HI段的好方法.也就是说,我认为这可以在多边形检测期间实现,因为这样的段只是复合路径的结果,并且在一个形状的检测过程中会在两个方向上被跟踪.(更多关于以下内容.)
第2步:多边形检测
每个段可以在两个方向上跟踪.例如,连接"O"和"P"的段可以是OP或PO.选取顺时针的跟踪方向,OP将属于多边形OPQN,而PO将属于多边形POI.
以下逻辑假设顺时针方向.
从任何线段开始,当跟踪时,如果返回到起点,则已识别出潜在的多边形.通过在你追踪时保持你的航向角度的运行增量(这是你的航向转动多少并且不要与简单地在段之间添加角度混淆),完成后,如果该角度是正的,你已经检测到有效多边形.如果它是负数,则表示您检测到"包含"多边形,这意味着包含一个或多个"有效"多边形.整个形状(或多个形状)的外周都包含多边形.
考虑方形的情况,对角线分为两个三角形.跟踪每个段两次 - 每个方向一次 - 最终会得到三个可能有效的多边形:一个正方形和两个三角形.三角形将具有正角度增量,告诉您它们是有效的,但是正方形的角度增量将为负,告诉您包含多边形.
注意:包含多边形也可以等于有效多边形.它只是在相反的方向"伤口".
考虑一个简单的三角形 顺时针轨迹将产生有效多边形.顺时针跟踪的第二次尝试实际上会产生一个逆时针的轨迹,这将给你一个负角度增量,告诉你实际上是形状的轮廓.
注意:您还必须测试在此过程中遇到的其他多边形,还要测试形状检测期间任何先前遇到的点的每个点.如果您发现重新访问了相同的点,请保存自第一次遇到该点以来创建的多边形,检查它的角度.如果它是正数,则它是一个有效的多边形(并且您实际上当前正在跟踪包含多边形.)如果它是负数,则您检测到包含多边形(在这种情况下,您当前正在跟踪有效多边形.)最后,全部删除累积堆栈上的段返回到上次遇到该点的第一个实例,并继续进行检测.
例如,如果你从"J"开始并逆时针方向追踪,你会经历"我","H",然后是"G",然后是"F"然后你会回到'H'.您刚刚发现了一个具有负角度的多边形HGF,因此您知道它是一个包含多边形.从堆栈中删除这三个段并继续.现在你再次点击'我'.在这种情况下,您在此过程中已经访问过相同的段,但在另一个方向上,只需从堆栈中完全删除该段并继续,然后在"O"旁边再"N",等等.您最终会成为回到'J'.
当在两个方向上跟踪某个段时,可以将其视为"已使用",并且不需要对该段进行进一步处理.继续处理所有未使用的段.一旦在两个方向上跟踪了所有段,您就可以确定已找到所有多边形 - 有效和包含 - .
最后,检查每个包含多边形以查看它是否属于任何有效多边形.如果是这样,请将其从有效多边形中排除,从而创建复合路径.在此处的示例中,包含多边形HGF的有效青色多边形包含它,因此应将其排除.注意,还有一个有效的HFG多边形,这里用红色标记.
无论如何,这就是我想出来的,但我想知道是否有更好/更简单的方法.思考?
我正在为即将到来的测试练习我的挥杆能力,并且油炸让我想到了这样的生物危害标志:
alt text http://img62.imageshack.us/img62/8372/lab6b.gif
我可以用Elipse2D绘制圆圈,但是我不知何故需要切割这3个三角形.我有什么想法可以做到这一点?
我的任务是编写允许用户绘制星星的程序,这些星星的大小和武器数量可能不同.当我处理基本的星星时,我使用的是GeneralPath和积分表:
int xPoints[] = { 55, 67, 109, 73, 83, 55, 27, 37, 1, 43 };
int yPoints[] = { 0, 36, 36, 54, 96, 72, 96, 54, 36, 36 };
Graphics2D g2d = ( Graphics2D ) g;
GeneralPath star = new GeneralPath();
star.moveTo( xPoints[ 0 ], yPoints[ 0 ] );
for ( int k = 1; k < xPoints.length; k++ )
star.lineTo( xPoints[ k ], yPoints[ k ] );
star.closePath();
g2d.fill( star );
Run Code Online (Sandbox Code Playgroud)
我应该选择哪种方法来绘制具有可变内径和外径以及不同臂数的恒星?这是我应该得到的:
我的问题涉及绘制似乎是徒手的线条的各种技巧:
特别是Steve Hanov发布了这篇优秀的博客文章.
从那以后,我能够使用贝塞尔曲线实现一个漂亮的手绘线算法.但是,我仍然坚持如何实现手绘椭圆.理想情况下,我想给它一个矩形用作边界,类似于其他椭圆绘图调用.但是,我希望它看起来非常写意.
到目前为止,我已经想到了最好的:
- (UIBezierPath*) freehandEllipseFromRect:(CGRect) rect {
// freehand ellipses need a lil more height
rect = CGRectMake(rect.origin.x, rect.origin.y-5, rect.size.width, rect.size.height+10);
UIBezierPath* path = [UIBezierPath bezierPath];
CGPoint topMidPoint = CGPointMake(rect.origin.x + (rect.size.width/2), rect.origin.y);
CGPoint bottomMidPoint = CGPointMake(rect.origin.x + (rect.size.width/2), rect.origin.y+rect.size.height);
// random point along bottom quarter of height, cause makes it look better
CGFloat randomY = (((CGFloat) (arc4random() % RAND_MAX) / RAND_MAX)) * (rect.size.height/4);
CGPoint leftControlPoint = CGPointMake(rect.origin.x-(rect.size.width), rect.origin.y+(rect.size.height-randomY));
// another random y;
randomY …
Run Code Online (Sandbox Code Playgroud) 基本上我想在CSS中创建一个形状(所以没有图像),这与心形相反.我不知道如何正确解释它,所以这是一个图像:
正如您所见,蓝色是背景,但我想要创建的形状不是心形,而是黑色矩形的形状.
如果我有以下形状(灰色不是黑色)
我可以复制它然后旋转它,这将给我我正在寻找的形状.
我有一个简单的图像,其中包含一些形状:一些矩形和一些椭圆形,总共 4 或 5 个。形状可以旋转、缩放和重叠。有一个示例输入:
我的任务是检测所有这些图形并准备一些有关它们的信息:大小、位置、旋转等。在我看来,核心问题是形状可以相互重叠。我尝试搜索一些有关此类问题的信息,发现 OpenCV 库非常有用。
OpenCV 能够检测轮廓,然后尝试将椭圆或矩形拟合到这些轮廓。问题是当形状重叠时,轮廓会混淆。
我考虑以下算法:检测所有特征点:并在它们上面放置白点。我得到了类似的东西,其中每个数字都分为不同的部分:
然后我可以尝试使用一些信息链接这些部分,例如复杂度值(我将曲线 approxPolyDP 拟合到轮廓并读取它有多少个部分)。但这开始变得非常困难。另一个想法是尝试连接轮廓的所有排列并尝试使图形适合它们。将输出最好的编译。
有什么想法如何创建简单但优雅的解决方案吗?
我很难理解 keras.layers.Conv2DTranspose 的输出形状
这是原型:
keras.layers.Conv2DTranspose(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
output_padding=None,
data_format=None,
dilation_rate=(1, 1),
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None
)
Run Code Online (Sandbox Code Playgroud)
在文档(https://keras.io/layers/convolutional/)中,我读到:
If output_padding is set to None (default), the output shape is inferred.
Run Code Online (Sandbox Code Playgroud)
在代码(https://github.com/keras-team/keras/blob/master/keras/layers/convolutional.py)中,我读到:
out_height = conv_utils.deconv_length(height,
stride_h, kernel_h,
self.padding,
out_pad_h,
self.dilation_rate[0])
out_width = conv_utils.deconv_length(width,
stride_w, kernel_w,
self.padding,
out_pad_w,
self.dilation_rate[1])
if self.data_format == 'channels_first':
output_shape = (batch_size, self.filters, out_height, out_width)
else:
output_shape = (batch_size, out_height, out_width, self.filters)
Run Code Online (Sandbox Code Playgroud)
和(https://github.com/keras-team/keras/blob/master/keras/utils/conv_utils.py):
def deconv_length(dim_size, …
Run Code Online (Sandbox Code Playgroud) 我需要从几个其他形状创建一个形状,理想情况下,我会在最后得到一个单一的形状结构,它会像 ZStack 那样堆叠两个形状。我在任何地方都没有注意到这个明显的实现,所以也许有人对如何实现它有一些想法?
这就是我想要的:
struct CustomShape: Shape {
func path(in rect: CGRect) -> Path {
// Add shapes here???? For example, combine Rectangle with Circle?
}
}
Run Code Online (Sandbox Code Playgroud) 我对这个问题有答案,但我花了太多时间寻找它。这就是我创建这个问题的原因,这样对其他人来说会更容易。
您不能像通常的视图一样使用形状 @drawable 来圆化图像角。这就是为什么您需要对代码内的图像进行一些更改。