Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/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 processing 从图像中检测LED物体状态_Image Processing_Opencv_Computer Vision - Fatal编程技术网

Image processing 从图像中检测LED物体状态

Image processing 从图像中检测LED物体状态,image-processing,opencv,computer-vision,Image Processing,Opencv,Computer Vision,我的问题类似于 我想从任何带有LED对象的图像中检测LED的开/关状态。LED对象可以是任意大小(但大部分是圆形)。获取该图像中所有LED的位置很重要,尽管它可以打开或关闭。首先,我想得到的状态和LED的位置,这是唯一的。目前,我的工作图像源是静态的,但它必须来自任何发光二极管产品的视频。因此,不可能使用模板图像来减去背景 我尝试过使用OpenCV(OpenCV的新功能)和阈值、轮廓和圆方法,但没有成功。请分享任何源代码或解决方案。解决方案可以是任何东西,而不仅仅是使用OpenCV,这将为我提

我的问题类似于

我想从任何带有LED对象的图像中检测LED的开/关状态。LED对象可以是任意大小(但大部分是圆形)。获取该图像中所有LED的位置很重要,尽管它可以打开或关闭。首先,我想得到的状态和LED的位置,这是唯一的。目前,我的工作图像源是静态的,但它必须来自任何发光二极管产品的视频。因此,不可能使用模板图像来减去背景

我尝试过使用OpenCV(OpenCV的新功能)和阈值、轮廓和圆方法,但没有成功。请分享任何源代码或解决方案。解决方案可以是任何东西,而不仅仅是使用OpenCV,这将为我提供结果。我们将不胜感激

与其他两个问题的不同之处在于,我想获得图像中LED的数量,无论它是打开还是关闭,以及所有LED的状态。我知道这很复杂。首先,我试图检测图像中发光的LED。我已经实现了下面共享的代码。我有不同的实现,但下面的代码能够通过绘制轮廓向我显示发光的LED,但轮廓的数量比发光的LED多。因此,我无法获得至少发光的LED的总数。请告诉我你的意见

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的数量
代码此时只考虑一个图像,但您可以使用循环对其进行增强以获取一批图像(我已经在我的repo中提供了一些示例图像) 您只需稍微调整LED的中心位置,因为从一个图像到另一个图像,它们可能不精确到一个像素(中心可能会稍微移动)

为了使算法更加稳健(知道LED是否亮起,找到一个自动且非硬编码的边距值),您可以使用直方图(位于extract_bright中)进行一些调整。 我已经创建了这个函数,您只需要对它进行一点增强

有关输入数据的更多信息: Opencv目前只接受avi文件,因此您必须将mp4文件转换为avi(在我的例子中是未压缩的)。我用过,效果很好。 由于某种原因,该功能导致我的计算机内存泄漏。这就是为什么我创建了grab_images函数,它将avi文件作为输入,并创建一批jpg图像,您可以更轻松地使用这些图像

以下是图像的结果:

输入图像:

二进制图像:

最终结果:

希望这有助于

编辑:

如果您想使用,您的问题会稍微复杂一些。我发布的方法仍然可以使用,但需要稍微复杂一点

您希望检测显示“信息”(状态、带宽等)的LED并丢弃设计部件

我看到了三个简单的解决方案:

  • 您以前知道LED的位置。在这种情况下,您可以应用完全相同的方法,但要应用于整个图像的精确部分(使用cv.SetImageROI)
  • 您对LED的颜色有着丰富的知识(您可以在图像上看到有两种不同的颜色)。然后,您可以搜索整个图像,然后应用颜色过滤器来限制您的选择
  • 你没有以前的知识。在这种情况下,事情变得更加复杂。我倾向于说,没有用的LED应该都有相同的颜色,状态LED通常会闪烁。这意味着,通过向该方法添加学习步骤,您可能能够看到哪些LED实际必须被选择为有用

希望这能带给你更多的思考

什么不适合你?没有一项工作是相当模糊的,请解释您是否有实现问题,或者为什么您的测试没有成功(至少您对它的看法)。另外,你和另外两个问题有什么不同?我已经编辑了我的问题并添加了代码。你能把你正在处理的图像放在这里吗?几个例子。因为我是一个新用户,我不允许上传图片。请查找下面的示例图像链接。您正在搜索只有一种颜色的LED吗?在开始算法之前你知道这种颜色吗?你有一批来自同一个地方的图像吗(或者你的相机是不是在移动?)?非常感谢。这对我帮助很大。我检查你的代码时发现了一些问题。我尝试了下面的一个图像,结果图像显示了不发光的LED对象和其他明亮的对象。我们如何消除这种情况,使其只检测到发光的LED?再次感谢您的回复。第一个和第二个解决方案不适用于我的情况。第三种情况,请你详细解释一下。我的意思是我不懂一些术语。例如,什么是学习步骤?如果你能扩大你的想法,那就太好了。好吧,这基本上意味着如果你没有以前的知识,唯一的解决办法就是用一种聪明的方式“猜”到哪里去搜索。我倾向于随时间记录图像,并搜索闪烁的物体。我会移除静物(在你的照片中,蓝色部分),因为它们不会随着时间移动,并且都有相同的颜色谢谢。你