小编Que*_*ann的帖子

稳健地找到具有相同直径的N个圆圈:替代强制Hough变换阈值

我正在开发用于跟踪培养皿(或其他圆形容器)中的小动物的应用程序.在进行任何跟踪之前,前几帧用于定义区域.每个碟子将匹配一个圆形的独立静态区域(即在跟踪期间不会更新).用户可以请求程序尝试从原始图像中找到菜肴并将其用作区域.

以下是示例: 在此输入图像描述 在此输入图像描述

为了执行此任务,我正在使用霍夫圆变换.但实际上,不同的用户将拥有非常不同的设置和图像,我不想让用户手动定义参数.我不能只猜测所有参数.

但是,我还有其他想要使用的信息:

我知道要检测的圆圈的确切数量.

  • 所有圆圈的尺寸几乎相同.
  • 圆圈不能重叠.
  • 我粗略地想到了圆圈的最小和最大尺寸.
  • 圆圈必须完全在图片中.

因此,我可以将要定义的参数数量缩小到一个:阈值.使用这些信息并考虑到我有N个圆圈可以找到,我目前的解决方案是测试许多阈值并保持标准偏差最小的圆圈(因为所有圆圈应该具有相似的大小):

//at this point, minRad and maxRad were calculated from the size of the image and the number of circles to find.
//assuming circles should altogether fill more than 1/3 of the images but cannot be altogether larger than the image.
//N is the integer number of circles to find.
//img is the picture of the scene (filtered).

//the vectors containing the detected circles and …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm opencv image-processing computer-vision

16
推荐指数
2
解决办法
1789
查看次数

通过迭代自适应阈值处理和形状分析来检测圆形对象的簇

我一直在开发一个应用程序来计算圆形物体,如图片中的细菌菌落.

容易的是这些物体通常与背景明显不同.

但是,很少有困难使分析变得棘手:

  1. 背景将呈现渐变和快速的强度变化.
  2. 在容器的边缘,对象将是椭圆形而不是圆形.
  3. 物体的边缘有时相当模糊.
  4. 对象将聚集.
  5. 物体可以很小(直径6px)
  6. 最终,算法将由不熟悉图像分析的人使用(通过GUI),因此参数必须直观且极少.

这个问题已在科学文献中多次解决并"解决",例如,使用圆形Hough变换或分水岭方法,但我从未对结果感到满意.

这是描述的一个简单的方法是通过获得自适应阈值和分裂前景(如我在描述这个交使用距离变换)的群集对象.

我已经成功地实现了这种方法,但它并不总能处理强度的突然变化.此外,同行们也要求我提出更"新颖"的方法.

因此,我正在寻找一种新方法来提取前景.

因此,我研究了其他阈值/斑点检测方法.我尝试了MSER但发现它们不是很强大而且在我的情况下非常慢.

我最终提出了一种算法,到目前为止,它给了我很好的结果:

  1. 我将图像的三个通道分开并降低噪点(模糊/中值模糊).对于每个频道:
  2. 我通过计算原始通道和卷积(通过大内核模糊)之间的绝对差异来应用自适应阈值处理的第一步的手动实现.然后,对于阈值的所有相关值:
  3. 我对结果应用了一个阈值2)
  4. 找到轮廓
  5. 在授予其形状(尺寸,面积,凸度......)时验证或使轮廓无效
  6. 然后,仅在累加器(每个通道1个累加器)中重新绘制有效的连续区域(由轮廓分隔).
  7. 在累积超过阈值的连续区域之后,我最终得到"地区分数"的映射.强度最高的区域是最常满足形态学过滤标准的区域.
  8. 然后将三个映射(每个通道一个)转换为灰度和阈值(阈值由用户控制)

只是为了向您展示我必须使用的图像类型: 在此输入图像描述 该图片代表顶部3个样本图像的一部分,以及底部各个部分的算法结果(蓝色=前景).

这是我的C++实现:3-7

/*
 * cv::Mat dst[3] is the result of the absolute difference between original and convolved channel.
 * MCF(std::vector<cv::Point>, int, int) is a filter function that returns an positive int only if the input contour is valid.
 */

/* Allocate 3 matrices (1 per channel)*/
cv::Mat accu[3];

/* We define the …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm opencv image-processing openmp

16
推荐指数
1
解决办法
5091
查看次数

我的跟踪算法基准测试框架

我目前正在开发一个基于OpenCV/C++的应用程序来跟踪小动物:以下是它应该处理的视频类型的示例.程序只输出动物的x,y位置和每个区域的时间.这是原始图像的结果图形表示.

我的问题有点尴尬 - 也许是主题 - 因为我不是在问如何改进我的程序,而是如何评估它.我知道在跟踪数据集上存在Bonn Benchmark,但它不适合我的情况.

该计划旨在处理非常长的视频,因此,我无法真实地要求独立人类评估动物的位置并比较人与计划.我还考虑过使用机器人或将转发器放在较大的动物上以获得精确的位置,但我并没有真正的资源.

我想出了使用程序生成在二维环境中移动的blob视频的想法.我的问题很简单:

您是否了解任何可编程的高级框架,我可以使用它来图形化模拟在可参数化背景中随机移动的对象的运动?

我的梦想是拥有一个像这样工作的命令行工具:

$ program [BACKGROUND_OPTIONS] [OBJECT_OPTIONS] -V VIDEO_OUTPUT -P POSITIONS_OUTPUT
Run Code Online (Sandbox Code Playgroud)

可以操纵背景纹理以及移动对象的形状,颜色和运动模式.

我知道我可能"很容易"自己制作(如果我找不到任何东西,我会的话),但我更愿意,如果评估的程序和参考尽可能独立(例如,不是两者都是相同的)人).

c++ simulation video opencv tracking

14
推荐指数
1
解决办法
734
查看次数

使用高度重复的密钥减少data.table的内存占用

我正在写一个包来分析高通量动物行为数据R.数据是多变量时间序列.我选择使用data.tables它来代表它们,我发现它非常方便.

对于一只动物,我会有类似的东西:

one_animal_dt <- data.table(t=1:20, x=rnorm(20), y=rnorm(20))
Run Code Online (Sandbox Code Playgroud)

然而,我和我的用户和许多动物一起工作,这些动物具有不同的任意治疗,条件和在每只动物恒定的其他变量.

最后,我发现代表数据的最方便的方法是将所有动物的行为和所有实验合并在一个数据表中,并使用额外的列,我设置为关键,这些列为"重复"变量".

所以,在概念上,类似的东西:

animal_list <- list()
animal_list[[1]] <- data.table(t=1:20, x=rnorm(20), y=rnorm(20),
                               treatment="A", date="2017-02-21 20:00:00", 
                               animal_id=1)
animal_list[[2]]  <- data.table(t=1:20, x=rnorm(20), y=rnorm(20),
                                treatment="B", date="2017-02-21 22:00:00",
                                animal_id=2)
# ...
final_dt <- rbindlist(animal_list)
setkeyv(final_dt,c("treatment", "date","animal_id"))
Run Code Online (Sandbox Code Playgroud)

这种方式可以非常方便地计算每只动物的摘要,同时对所有生物信息(治疗等)不可知.

在实践中,我们为每只动物提供了数百万(而不是20)个连续读取,因此为方便起见,我们添加的列包含高度重复的值,这不是内存效率.

有没有办法压缩这个高度冗余的密钥而不会丢失表的结构(即列)?理想情况下,我不想强​​迫我的用户自己使用JOIN.

memory r data.table

14
推荐指数
2
解决办法
898
查看次数

OpenCV,如何使用点阵列来平滑和采样轮廓?

我有一个问题是在OpenCV(C++ API)中平滑和采样轮廓.假设我已经从中检索了一系列点数cv::findContours(例如应用于此图像:

在此输入图像描述

最终,我想要

  1. 使用不同的内核平滑一系列点.
  2. 使用不同类型的插值调整序列的大小.

平滑后,我希望得到如下结果:

在此输入图像描述

我还考虑在a中绘制轮廓cv::Mat,过滤Mat(使用模糊或形态学操作)并重新找到轮廓,但速度慢且次优.因此,理想情况下,我可以专门使用点序列来完成工作.

我在上面阅读了几篇帖子并天真地认为我可以简单地将一个std::vector(of cv::Point)转换为a cv::Mat然后像模糊/调整大小的OpenCV函数将为我做的工作......但他们没有.

这是我尝试过的:

int main( int argc, char** argv ){

    cv::Mat conv,ori;
    ori=cv::imread(argv[1]);
    ori.copyTo(conv);
    cv::cvtColor(ori,ori,CV_BGR2GRAY);

    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i > hierarchy;

    cv::findContours(ori, contours,hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

    for(int k=0;k<100;k += 2){
        cv::Mat smoothCont;

        smoothCont = cv::Mat(contours[0]);
        std::cout<<smoothCont.rows<<"\t"<<smoothCont.cols<<std::endl;
        /* Try smoothing: no modification of the array*/
//        cv::GaussianBlur(smoothCont, smoothCont, cv::Size(k+1,1),k);
        /* Try sampling: "Assertion failed (func != 0) in resize"*/
//        cv::resize(smoothCont,smoothCont,cv::Size(0,0),1,1);
        std::vector<std::vector<cv::Point> > v(1);
        smoothCont.copyTo(v[0]);
        cv::drawContours(conv,v,0,cv::Scalar(255,0,0),2,CV_AA); …
Run Code Online (Sandbox Code Playgroud)

c++ opencv contour sampling

13
推荐指数
1
解决办法
1万
查看次数

使用具有自适应阈值的掩码?

我正在使用OpenCV-2.3 API在C++中编写一个小程序.我在使用非矩形掩模处理自适应阈值时遇到问题.

到目前为止,我正在对整个图像执行自适应阈值并在之后进行屏蔽.我意识到,在我的情况下,这是一个错误,因为屏蔽像素将用于计算我感兴趣的像素的阈值(虽然我只是想从分析中排除前者)...但是,不像像cv :: norm,cv :: adaptiveThreshold似乎不支持显式掩码.

你知道任何明显的解决方案或解决方法吗?昆汀,非常感谢你的建议

c++ opencv

9
推荐指数
1
解决办法
4381
查看次数

如何在OpenCV中过滤由重叠圆圈组成的轮廓

我正在使用OpenCV/C++框架,在一个基本上计算可以重叠的椭圆对象的程序上工作.

在阈值图像和找到所有对象的轮廓之后

我的下一步涉及排除不是由重叠椭圆组成的对象(我将稍后对剩余的对象进行分段).

我最终得到了这些对象:

在此输入图像描述

在此示例图像中,右侧的所有对象都是负的,而左侧的对象是有效的.

我当前的滤波器主要以它们的等周数为基础排除物体.然而,由于我有不同大小和噪音的物体,我并不总是对这种方法感到满意.

理想情况下,我希望有一个额外的指标来提高我当前过滤器的效率.

由于我必须在许多轮廓上重复这种分析,因此不应该付出昂贵的代价.

我考虑过如下方法:

  • 基于轮廓中连续点的所有三元组之间角度值的直方图的东西?
  • 在数学上拟合"多椭圆"(我不知道如何做到这一点)?
  • 匹配自由人链?

但我确信我错过了一些更有效,更少杂乱的东西.你有什么建议吗,谢谢:),

编辑: 正如瑞吉斯正确建议的那样,任何形状实际上都可以由足够数量的圆圈组成.因此,为了使我的问题可以解决,我将添加以下假设:

  1. 不超过16个椭圆/对象.
  2. 椭圆不能平坦:长轴/短轴<3.
  3. 在一个物体内,最小椭圆区域上最大椭圆的面积必须小于10.

c++ algorithm geometry opencv image-processing

9
推荐指数
1
解决办法
2551
查看次数