C++ C++;OpenCV-在网络摄像头流中找到最大的对象并按大小排序
我的目标是找到捕获的网络摄像头帧的最大轮廓,然后在找到它之后,找到它的大小,并确定是否被拒绝或接受 为了说明这个项目的目的,我目前在一家卫生产品制造商工作。在那里,我们总共有6名工人负责将有缺陷的肥皂条从生产线中分拣出来。因此,为了获得从事其他活动的劳动力,我试图编写一个算法来“替换”他们的眼睛 在此过程中,我尝试了几种方法(FindOntours、SimpleBlobDetection、Canny、对象跟踪),但我一直面临的问题是,我似乎无法找到一种方法来有效地找到网络摄像头图像中最大的对象,找到其大小,然后决定放弃或接受它 下面是我的最新代码,用于查找网络摄像头流中的最大轮廓:C++ C++;OpenCV-在网络摄像头流中找到最大的对象并按大小排序,c++,visual-studio,opencv,C++,Visual Studio,Opencv,我的目标是找到捕获的网络摄像头帧的最大轮廓,然后在找到它之后,找到它的大小,并确定是否被拒绝或接受 为了说明这个项目的目的,我目前在一家卫生产品制造商工作。在那里,我们总共有6名工人负责将有缺陷的肥皂条从生产线中分拣出来。因此,为了获得从事其他活动的劳动力,我试图编写一个算法来“替换”他们的眼睛 在此过程中,我尝试了几种方法(FindOntours、SimpleBlobDetection、Canny、对象跟踪),但我一直面临的问题是,我似乎无法找到一种方法来有效地找到网络摄像头图像中最大的对象,
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv/cv.h"
#include "opencv2\imgproc\imgproc.hpp"
using namespace cv;
using namespace std;
int main(int argc, const char** argv)
{
Mat src;
Mat imgGrayScale;
Mat imgCanny;
Mat imgBlurred;
/// Load source image
VideoCapture capWebcam(0);
if (capWebcam.isOpened() == false)
{
cout << "Não foi possível abrir webcam!" << endl;
return(0);
}
while (capWebcam.isOpened())
{
bool blnframe = capWebcam.read(src);
if (!blnframe || src.empty())
{
cout << "Erro! Frame não lido!\n";
break;
}
int largest_area = 0;
int largest_contour_index = 0;
Rect bounding_rect;
Mat thr(src.rows, src.cols, CV_8UC1);
Mat dst(src.rows, src.cols, CV_8UC1, Scalar::all(0));
cvtColor(src, imgGrayScale, CV_BGR2GRAY); //Convert to gray
GaussianBlur(imgGrayScale, imgBlurred, Size(5, 5), 1.8);
Canny(imgBlurred, imgCanny, 45, 90); //Threshold the gray
vector<vector<Point>> contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(imgCanny, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
for (int i = 0; i < contours.size(); i++) // iterate through each contour.
{
double a = contourArea(contours[i], false); // Find the area of contour
if (a > largest_area)
{
largest_area = a;
largest_contour_index = i; //Store the index of largest contour
bounding_rect = boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
}
}
Scalar color(255, 255, 255);
drawContours(dst, contours, largest_contour_index, color, CV_FILLED, 8, hierarchy); // Draw the largest contour using previously stored index.
rectangle(src, bounding_rect, Scalar(0, 255, 0), 1, 8, 0);
imshow("src", src);
imshow("largest Contour", dst);
waitKey(27);
}
return(0);
}
#包括
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv/cv.h”
#包括“opencv2\imgproc\imgproc.hpp”
使用名称空间cv;
使用名称空间std;
int main(int argc,常量字符**argv)
{
Mat-src;
Mat-imgGrayScale;
Mat imgCanny;
Mat imgBlurred;
///加载源映像
视频捕获网络摄像头(0);
if(capWebcam.isOpened()==false)
{
这个问题的标题是不是很混乱——要么有一个“最大”的对象,要么有多个相同大小的对象。按大小排序能实现什么?我看到了……实际上它应该有更多的包(如上面显示的一个)在场景中。我的目标是根据物体的大小计算出物体的倍数,然后决定是丢弃还是接受。但首先,为了能够计算出面积/大小,我认为最好是找到一个物体,然后计算……我不知道……我现在有点迷茫……我真的在寻找正确的方向现在!你确实得到了一个很好的标志轮廓。你的目标是在同一框架内检测多个包装中该标志的大小吗?实际上,我的目标是获得包装的外部区域(而不是标志),对其进行轮廓,计算其面积,然后执行一个条件,以拒绝或接受它。问题是我无法找到对象的外部轮廓,只有徽标…另一件事是,对象必须几乎冻结在摄像机前才能被检测到…我想知道是否有办法更快地检测到它…这个问题的标题相当混乱--要么有一个“最大”的对象,要么有多个大小相同的对象。按大小排序可以实现什么?我看到了…实际上它应该有更多的包(如上面显示的一个)在场景中。我的目标是根据物体的大小计算出物体的倍数,然后决定是丢弃还是接受。但首先,为了能够计算出面积/大小,我认为最好是找到一个物体,然后计算……我不知道……我现在有点迷茫……我真的在寻找正确的方向现在!你确实得到了一个很好的标志轮廓。你的目标是在同一框架内检测多个包装中该标志的大小吗?实际上,我的目标是获得包装的外部区域(而不是标志),对其进行轮廓,计算其面积,然后执行一个条件,以拒绝或接受它。问题是我无法找到对象的外部轮廓,只有徽标…另一件事是,对象必须几乎冻结在摄像机前才能被检测到…我想知道是否有办法更快地检测到它...