content:
Hello there,
For a personnel projet, I\'m trying to detect object and there shadow. These are the result I have for now: Original:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 怎样提取运动物体的轮廓?相关的知识,希望对你有一定的参考价值。
如题 比如在视频中我只想提取运动的车的轮廓 别的不要
用于运动轮廓提取的方法主要有:帧间差分法,滑动平均法、混合高斯建模提取前景,还有所谓的光流法、Codebook法,经过试验证明,帧间差分法效果可待商榷,滑动平均法对帧间差分有所改进,但对于室外的情况,光线的变化对其有一定的影响,混合高斯和Codebook法对光线比较敏感,应用此法得想办法在应用此两法前对视频序列进行预处理,光流法实现的主要有(Horn-Schunck和Lucas-Kanade),但计算量大,难以满足实时性的需求。 参考技术A 你可以在提取的轮廓中进行识别,一般来说,车得轮廓比较大追问我的阀值是800 不怎么准确啊
本回答被提问者采纳 参考技术B 可以先做背景建模把运动目标找出来,然后提取轮廓这套算法首先解决了在复杂背景下轮廓提取的问题,而且我认为也是稳健鲁棒的。其中,算法中除了经典的“hsv分解->ostu阈值->最大轮廓标注”外,最为关键的算法为底帽去光差。这个算法来自于冈萨雷斯《数字图像处理教程》形态学篇章,完全按照书本建议实现,体现良好作用。
一、问题提出
这是一个来自"answerOpenCV"(http://answers.opencv.org/question/200422/opencv-c-filling-holes/)整编如下:
content:
Hello there,
For a personnel projet, I\'m trying to detect object and there shadow. These are the result I have for now: Original:
二、问题分析
从原始图片上来看,这张图片的拍摄的背景比较复杂,此外光照也存在偏光现象;而提问者虽然提出的是“将缝隙合并”的要求,实际上他还是想得到目标物体的准确轮廓。
整体思路:(思路很重要!!!)
opencv实现:
Mat moveLightDiff(Mat src, int radius); Mat src = imread("D:/opencv练习图片/复杂背景下提取轮廓.png"); imshow("原始图", src); Mat src_hsv,src_h,src_s, src_v,src_tophat,src_bin; cvtColor(src, src_hsv, COLOR_RGB2HSV); vector<Mat> rgb_planes; split(src_hsv, rgb_planes); src_h = rgb_planes[0]; imshow("H通道", src_h); Mat kernel = getStructuringElement(MORPH_RECT, Size(30, 30), Point(-1, -1)); morphologyEx(src_h, src_h, MORPH_BLACKHAT, kernel, Point(-1, -1)); imshow("BLACKPHAT", src_h); threshold(src_h, src_bin, 100, 255, THRESH_OTSU); imshow("二值化", src_bin); int max = 0; int index = -1; vector<vector<Point> >contours; findContours(src_bin, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); for (int i = 0; i < contours.size(); i++) { int area= contourArea(contours[i]); if (max < area) { index = i; max = area; } } drawContours(src, contours, index, Scalar(0, 0, 255), 2); imshow("显示轮廓", src);
顶帽变换和底帽(黑帽)变换属于图像形态学处理的一种,可用于校正不均匀光照的影响。
如上图所示。当图像各部分光照不均匀造成的背景灰度不均现象,单纯用二值化处理效果不好就可以用顶帽(底帽)处理。由于原图是背景亮,前景暗,对原图进行底帽变换以解决光照不均匀的问题。
直接对h通道二值化效果:
先底帽矫正后再二值化效果:
摘录于寻找复杂背景下物体的轮廓(OpenCV / C++ - Filling holes) - jsxyhelu - 博客园 (cnblogs.com)
以上是关于opencv 怎样提取运动物体的轮廓?的主要内容,如果未能解决你的问题,请参考以下文章