Image processing 从图像中检测LED物体状态
我的问题类似于 我想从任何带有LED对象的图像中检测LED的开/关状态。LED对象可以是任意大小(但大部分是圆形)。获取该图像中所有LED的位置很重要,尽管它可以打开或关闭。首先,我想得到的状态和LED的位置,这是唯一的。目前,我的工作图像源是静态的,但它必须来自任何发光二极管产品的视频。因此,不可能使用模板图像来减去背景 我尝试过使用OpenCV(OpenCV的新功能)和阈值、轮廓和圆方法,但没有成功。请分享任何源代码或解决方案。解决方案可以是任何东西,而不仅仅是使用OpenCV,这将为我提供结果。我们将不胜感激 与其他两个问题的不同之处在于,我想获得图像中LED的数量,无论它是打开还是关闭,以及所有LED的状态。我知道这很复杂。首先,我试图检测图像中发光的LED。我已经实现了下面共享的代码。我有不同的实现,但下面的代码能够通过绘制轮廓向我显示发光的LED,但轮廓的数量比发光的LED多。因此,我无法获得至少发光的LED的总数。请告诉我你的意见Image processing 从图像中检测LED物体状态,image-processing,opencv,computer-vision,Image Processing,Opencv,Computer Vision,我的问题类似于 我想从任何带有LED对象的图像中检测LED的开/关状态。LED对象可以是任意大小(但大部分是圆形)。获取该图像中所有LED的位置很重要,尽管它可以打开或关闭。首先,我想得到的状态和LED的位置,这是唯一的。目前,我的工作图像源是静态的,但它必须来自任何发光二极管产品的视频。因此,不可能使用模板图像来减去背景 我尝试过使用OpenCV(OpenCV的新功能)和阈值、轮廓和圆方法,但没有成功。请分享任何源代码或解决方案。解决方案可以是任何东西,而不仅仅是使用OpenCV,这将为我提
int main(int argc, char* argv[])
{
IplImage* newImg = NULL;
IplImage* grayImg = NULL;
IplImage* contourImg = NULL;
float minAreaOfInterest = 180.0;
float maxAreaOfInterest = 220.0;
//parameters for the contour detection
CvMemStorage * storage = cvCreateMemStorage(0);
CvSeq * contours = 0;
int mode = CV_RETR_EXTERNAL;
mode = CV_RETR_CCOMP; //detect both outside and inside contour
cvNamedWindow("src", 1);
cvNamedWindow("Threshhold",1);
//load original image
newImg = cvLoadImage(argv[1], 1);
IplImage* imgHSV = cvCreateImage(cvGetSize(newImg), 8, 3);
cvCvtColor(newImg, imgHSV, CV_BGR2HSV);
cvNamedWindow("HSV",1);
cvShowImage( "HSV", imgHSV );
IplImage* imgThreshed = cvCreateImage(cvGetSize(newImg), 8, 1);
cvInRangeS(newImg, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);
cvShowImage( "src", newImg );
cvShowImage( "Threshhold", imgThreshed );
//make a copy of the original image to draw the detected contour
contourImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 3);
contourImg=cvCloneImage( newImg );
cvNamedWindow("Contour",1);
//find the contour
cvFindContours(imgThreshed, storage, &contours, sizeof(CvContour), mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
int i = 0;
for (; contours != 0; contours = contours->h_next)
{
i++;
//ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); //randomly coloring different contours
cvDrawContours(contourImg, contours, CV_RGB(0, 255, 0), CV_RGB(255, 0, 0), 2, 2, 8, cvPoint(0,0));
}
printf("Total Contours:%d\n", i);
cvShowImage( "Contour", contourImg );
cvWaitKey(0);
cvDestroyWindow( "src" ); cvDestroyWindow( "Threshhold" );
cvDestroyWindow( "HSV" );
cvDestroyWindow( "Contour" );
cvReleaseImage( &newImg ); cvReleaseImage( &imgThreshed );
cvReleaseImage( &imgHSV );
cvReleaseImage( &contourImg );
}
昨天晚上我有一些时间,这里有一个(非常)简单和局部的解决方案,对我来说很好。 我创建了一个可以直接克隆的git存储库: git://github.com/jlengrand/image_processing.git 并使用Python运行
$ cd image_processing/LedDetector/
$ python leddetector/led_highlighter.py
你可以看到代码
我的方法:
- 转换为单通道图像
- 搜索最亮的像素,假设我们至少有一个LED亮着,并且图像上有一个黑色背景
- 创建具有图像最亮部分的二值图像
- 从图像中提取斑点,检索其中心和LED的数量
- 您以前知道LED的位置。在这种情况下,您可以应用完全相同的方法,但要应用于整个图像的精确部分(使用cv.SetImageROI)
- 您对LED的颜色有着丰富的知识(您可以在图像上看到有两种不同的颜色)。然后,您可以搜索整个图像,然后应用颜色过滤器来限制您的选择
- 你没有以前的知识。在这种情况下,事情变得更加复杂。我倾向于说,没有用的LED应该都有相同的颜色,状态LED通常会闪烁。这意味着,通过向该方法添加学习步骤,您可能能够看到哪些LED实际必须被选择为有用李>
希望这能带给你更多的思考什么不适合你?没有一项工作是相当模糊的,请解释您是否有实现问题,或者为什么您的测试没有成功(至少您对它的看法)。另外,你和另外两个问题有什么不同?我已经编辑了我的问题并添加了代码。你能把你正在处理的图像放在这里吗?几个例子。因为我是一个新用户,我不允许上传图片。请查找下面的示例图像链接。您正在搜索只有一种颜色的LED吗?在开始算法之前你知道这种颜色吗?你有一批来自同一个地方的图像吗(或者你的相机是不是在移动?)?非常感谢。这对我帮助很大。我检查你的代码时发现了一些问题。我尝试了下面的一个图像,结果图像显示了不发光的LED对象和其他明亮的对象。我们如何消除这种情况,使其只检测到发光的LED?再次感谢您的回复。第一个和第二个解决方案不适用于我的情况。第三种情况,请你详细解释一下。我的意思是我不懂一些术语。例如,什么是学习步骤?如果你能扩大你的想法,那就太好了。好吧,这基本上意味着如果你没有以前的知识,唯一的解决办法就是用一种聪明的方式“猜”到哪里去搜索。我倾向于随时间记录图像,并搜索闪烁的物体。我会移除静物(在你的照片中,蓝色部分),因为它们不会随着时间移动,并且都有相同的颜色谢谢。你