Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Image 从纸质目标检测圆和射击_Image_Opencv_Image Processing_Computer Vision_Artificial Intelligence - Fatal编程技术网

Image 从纸质目标检测圆和射击

Image 从纸质目标检测圆和射击,image,opencv,image-processing,computer-vision,artificial-intelligence,Image,Opencv,Image Processing,Computer Vision,Artificial Intelligence,我正在做一个小项目,在那里我必须检测从给定的纸张目标图像中得到的分数。类似于iPhone的TargetScan应用程序 我使用openCV处理图像,基本上我有两个部分,一个是从目标检测圆(这在Hough圆变换中非常有效),第二部分是检测镜头。我需要一些关于如何从给定图像中检测这些镜头的想法。下面是一幅启用圆检测的示例图像(绿色线表示检测到的圆,红色点表示中心)。openCV中的哪些算法可用于检测这些嫩芽? 下面是另一个示例图像 算法: 为图像创建/清除遮罩 对图像进行二值化(通过某种强度阈值将

我正在做一个小项目,在那里我必须检测从给定的纸张目标图像中得到的分数。类似于iPhone的TargetScan应用程序

我使用openCV处理图像,基本上我有两个部分,一个是从目标检测圆(这在Hough圆变换中非常有效),第二部分是检测镜头。我需要一些关于如何从给定图像中检测这些镜头的想法。下面是一幅启用圆检测的示例图像(绿色线表示检测到的圆,红色点表示中心)。openCV中的哪些算法可用于检测这些嫩芽?

下面是另一个示例图像 算法:

  • 为图像创建/清除遮罩
  • 对图像进行二值化(通过某种强度阈值将图像转换为黑白)
  • 处理所有像素
  • 计算在
    x,y
    方向上有多少相同颜色的像素

    叫它wx,wy

  • 检测圆圈、镜头和中间部分

    圆圈很薄,因此
    wx
    wy
    应小于薄阈值,而另一个圆圈应更大镜头很大,因此展位
    wx
    wy
    必须在镜头直径范围内中间部分为黑色,booth
    wx,wy
    高于所有阈值(您可以在此处计算平均点)。将此信息存储到掩码中

  • 使用遮罩信息重新收集图像

  • 从找到的点计算圆的中心和半径

    中心是中间区域的平均点,现在处理所有绿点并计算其半径。对所有找到的半径进行直方图分析,并按递减计数进行排序。如果不忽略这些点,计数应与
    2*PI*r
    一致

  • 将快照像素分组在一起

    因此,对每次命中进行分段或整体填充,以避免单次命中的多次计算

  • < > >我在C++中编码了1….. 6,这里是代码:< /强> < /p>
    图片pic0、pic1、pic2;
    //pic0源
    //pic1-输出
    //pic2-掩模
    int x,y,i,n,wx,wy;
    int r0=3;//细曲线宽齿槽[像素]
    int r1a=15;//镜头直径最小treshod[像素]
    int r1b=30;//镜头直径最大treshod[像素]
    int x0,y0;//平均点==中心
    //初始输出为源图像,但仅以灰度强度输出
    pic1=pic0;
    pic1.rgb2i();
    //初始掩码(源图像的大小)
    pic2.resize(pic0.xs,pic0.ys);
    pic2.clear(0);
    //将图像二值化并转换回RGB
    对于(y=r0;x0,y0-i);
    pic1.bmp->Canvas->LineTo(x0,y0+i);
    
    我使用自己的图片类处理图像,因此一些成员是:


    xs,ys
    以像素为单位的图像大小
    p[y][x].dd
    是位于
    (x,y)
    位置的32位整数类型的像素
    清除(彩色)
    -清除整个图像
    调整大小(xs,ys)
    -将图像大小调整为新的分辨率

    这是重新存储的结果

    • 绿色细圆
    • 蓝色中段
    • 红十字会(圆心)
    • 红色镜头
    正如你所看到的,它需要从项目符号#7、#8进行进一步处理,而且你的图像在中段外没有快照,因此可能也需要对中段外的快照检测进行一些调整

    [edit1]半径

    //创建并清除半径直方图
    n=xs;如果(nPen->Width=r0;
    pic1.bmp->Canvas->Brush->Style=bsClear;
    对于(i=0;i=0.3)和(aCanvas->椭圆(x0-i,y0-i,x0+i,y0+i);
    }
    pic1.bmp->Canvas->Brush->Style=bsSolid;
    pic1.bmp->Canvas->Pen->Width=1;
    删除[]历史记录;
    


    检测到的圆是洋红色的…我认为很好。中间部分有点扭曲。你可以计算平均半径步长并插值缺少的圆…

    你也可以分享你的图片类吗?我很想使用它。@Aman不,但它很可能对你没有好处,因为它是VCL边界,并且使用了一些公司代码C(C++)类本身是~(120)字节的纯源代码。但是,与描述方法一样,共享它的特定部分是可以的,因为我在SO/SE上做了很多次。如果您只需要简单快捷的像素访问,请看这是我的图片所构建的相同的东西。