C++ OpenCV c++;断言失败<;我<;0>;在cv::_InputArray::getMat中 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; //初始最小和最大HSV过滤器值。 //这些将使用轨迹栏进行更改 Mat-src;Mat-HSV;Mat-roi;垫范围;席蚀;席灰色; int thresh=100; int max_thresh=255; /**@主功能*/ int main(int argc,字符**argv) { createtrackbar(); VideoCapture cap(0);//打开默认摄像机 if(!cap.isopend())//检查我们是否成功 返回-1; namedWindow(“背景”,1); int waitTime=50; int计数器=101; int左=20; int roiTop=50; int右=200; int=200; Rect rRoi=Rect(ROI左、ROI上、ROI右、ROI下); 垫子背景; cap>>背景; 背景=背景(rRoi); //CVT颜色(背景、背景、CV_BGR2HSV); //imshow(“背景”,背景); 矢量等值线; 向量>外壳(1); 向量层次; 矢量缺陷; while(true) { cap>>src; //创建感兴趣的区域。 Mat iRoi=src.clone()(rRoi); Mat iRoiSRC=src(rRoi); //在那里画一个矩形。 矩形(src、rRoi、标量(255、128、0)、1、8、0); //imshow(“roi”,iRoi); //减去静态背景。 absdiff(iRoi,背景,iRoi); //imshow(“diff”,iRoi); //将其转换为灰度并设置阈值。 CVT颜色(iRoi、iRoi、CV_bgr2灰色); 阈值(iRoi,灰色,15,255,CV_阈值_二进制); //执行关闭操作。 Mat DecreateElement=getStructuringElement(变形椭圆,大小(腐蚀大小,腐蚀大小)); Mat DigitalElement=getStructuringElement(变形椭圆,大小(DigitalSize,DigitalSize)); for(int index=0;index0) { convexHull(等高线[biggestContourIndex],hullsI,true,true); convexHull(等高线[biggestContourIndex],hullsP,true,true); } //找出凸性缺陷。 如果(等高线.size()>0) { 如果(等高线[biggestContourIndex].size()>3) { 凸面缺陷(轮廓[最大轮廓指数]、hullsI、缺陷); } } //绘制最大轮廓及其凸面外壳。 标量colorOne=标量(255,128,0); 标量颜色二=标量(0,0,255); 如果(等高线.size()>0) { drawContours(iRoiSRC,contours,biggestContourIndex,colorOne,2,8,hierarchy,0,Point()); 绘制轮廓(iRoiSRC、hullsP、0、colorTwo、1、8、vector()、0、Point()); 矩形(iRoiSRC,boundingRect(轮廓[biggestContourIndex]),标量(0,255,0),1,8,0); } imshow(“src”,src); 如果(waitKey(waitTime)>=0)中断; } 返回(0); }
屏幕左上角有一个矩形,我的手一握住就会被认出C++ OpenCV c++;断言失败<;我<;0>;在cv::_InputArray::getMat中 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; //初始最小和最大HSV过滤器值。 //这些将使用轨迹栏进行更改 Mat-src;Mat-HSV;Mat-roi;垫范围;席蚀;席灰色; int thresh=100; int max_thresh=255; /**@主功能*/ int main(int argc,字符**argv) { createtrackbar(); VideoCapture cap(0);//打开默认摄像机 if(!cap.isopend())//检查我们是否成功 返回-1; namedWindow(“背景”,1); int waitTime=50; int计数器=101; int左=20; int roiTop=50; int右=200; int=200; Rect rRoi=Rect(ROI左、ROI上、ROI右、ROI下); 垫子背景; cap>>背景; 背景=背景(rRoi); //CVT颜色(背景、背景、CV_BGR2HSV); //imshow(“背景”,背景); 矢量等值线; 向量>外壳(1); 向量层次; 矢量缺陷; while(true) { cap>>src; //创建感兴趣的区域。 Mat iRoi=src.clone()(rRoi); Mat iRoiSRC=src(rRoi); //在那里画一个矩形。 矩形(src、rRoi、标量(255、128、0)、1、8、0); //imshow(“roi”,iRoi); //减去静态背景。 absdiff(iRoi,背景,iRoi); //imshow(“diff”,iRoi); //将其转换为灰度并设置阈值。 CVT颜色(iRoi、iRoi、CV_bgr2灰色); 阈值(iRoi,灰色,15,255,CV_阈值_二进制); //执行关闭操作。 Mat DecreateElement=getStructuringElement(变形椭圆,大小(腐蚀大小,腐蚀大小)); Mat DigitalElement=getStructuringElement(变形椭圆,大小(DigitalSize,DigitalSize)); for(int index=0;index0) { convexHull(等高线[biggestContourIndex],hullsI,true,true); convexHull(等高线[biggestContourIndex],hullsP,true,true); } //找出凸性缺陷。 如果(等高线.size()>0) { 如果(等高线[biggestContourIndex].size()>3) { 凸面缺陷(轮廓[最大轮廓指数]、hullsI、缺陷); } } //绘制最大轮廓及其凸面外壳。 标量colorOne=标量(255,128,0); 标量颜色二=标量(0,0,255); 如果(等高线.size()>0) { drawContours(iRoiSRC,contours,biggestContourIndex,colorOne,2,8,hierarchy,0,Point()); 绘制轮廓(iRoiSRC、hullsP、0、colorTwo、1、8、vector()、0、Point()); 矩形(iRoiSRC,boundingRect(轮廓[biggestContourIndex]),标量(0,255,0),1,8,0); } imshow(“src”,src); 如果(waitKey(waitTime)>=0)中断; } 返回(0); },c++,opencv,assertion,C++,Opencv,Assertion,屏幕左上角有一个矩形,我的手一握住就会被认出 我得到的错误出现在第一个drawContours处。控制台给我的完整错误是:OpenCV错误:断言失败转换向量缺陷在某种程度上似乎起到了作用您是否调试了单步执行代码,以查看i的负值实际上来自何处?@πάνταῥεῖ 是的,但是我找不到值。您能在函数调用之前打印索引吗?顺便说一句,contour.size()不是轮廓的面积,而是点数@Mika biggestContourIndex每次都为1,因为它确实检测到我的手是最大的区域。我将更改变量名。不清楚。
我得到的错误出现在第一个
drawContours
处。控制台给我的完整错误是:OpenCV错误:断言失败转换向量缺陷
在某种程度上似乎起到了作用您是否调试了单步执行代码,以查看i
的负值实际上来自何处?@πάνταῥεῖ 是的,但是我找不到值。您能在函数调用之前打印索引吗?顺便说一句,contour.size()不是轮廓的面积,而是点数@Mika biggestContourIndex每次都为1,因为它确实检测到我的手是最大的区域。我将更改变量名。不清楚。非常感谢。发现矢量缺陷;需要转换为点向量,现在可以工作了。谢谢你的帮助!
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/background_segm.hpp>
#include <iostream>
#include <windows.h>
using namespace cv;
using namespace std;
//initial min and max HSV filter values.
//these will be changed using trackbars
Mat src; Mat HSV; Mat roi; Mat range; Mat eroded; Mat gray;
int thresh = 100;
int max_thresh = 255;
/** @function main */
int main(int argc, char** argv)
{
createTrackbars();
VideoCapture cap(0); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return -1;
namedWindow("background", 1);
int waitTime = 50;
int counter = 101;
int roiLeft = 20;
int roiTop = 50;
int roiRight = 200;
int roiBottom = 200;
Rect rRoi = Rect(roiLeft, roiTop, roiRight, roiBottom);
Mat background;
cap >> background;
background = background(rRoi);
//cvtColor(background, background, CV_BGR2HSV);
//imshow("background", background);
vector<vector<Point> > contours;
vector<vector < cv::Point >> hull(1);
vector<Vec4i> hierarchy;
vector<CvConvexityDefect> defects;
while (true)
{
cap >> src;
//Create the region of interest.
Mat iRoi = src.clone()(rRoi);
Mat iRoiSRC = src(rRoi);
//Draw a rectangle there.
rectangle(src, rRoi, Scalar(255, 128, 0), 1, 8, 0);
//imshow("roi", iRoi);
//Subtract the static background.
absdiff(iRoi, background, iRoi);
//imshow("diff", iRoi);
//Convert it to a GrayScale and threshold it.
cvtColor(iRoi, iRoi, CV_BGR2GRAY);
threshold(iRoi, gray, 15, 255, CV_THRESH_BINARY);
//Perform a closing.
Mat erodeElement = getStructuringElement(MORPH_ELLIPSE, Size(erodeSize, erodeSize));
Mat dilateElement = getStructuringElement(MORPH_ELLIPSE, Size(dilateSize, dilateSize));
for (int index = 0; index < loopAmount; index++)
{
erode(gray, gray, erodeElement);
dilate(gray, gray, dilateElement);
}
//imshow("range", gray);
//Find the contours.
findContours(gray, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
//Pick the biggest contour.
int biggestContourIndex = 0;
int largestArea = 0;
for (int i = 0; i < contours.size(); i++)
{
if (contours[i].size() > largestArea)
{
largestArea = contours[i].size();
biggestContourIndex = i;
}
}
vector<int> hullsI;
vector<Point> hullsP;
vector<Vec4i> defects;
//Find the convex hull.
if (contours.size() > 0)
{
convexHull(contours[biggestContourIndex], hullsI, true, true);
convexHull(contours[biggestContourIndex], hullsP, true, true);
}
//Find the convexity defects.
if (contours.size() > 0)
{
if (contours[biggestContourIndex].size() > 3)
{
convexityDefects(contours[biggestContourIndex], hullsI, defects);
}
}
//Draw the biggest contour and its convex hull.
Scalar colorOne = Scalar(255, 128, 0);
Scalar colorTwo = Scalar(0, 0, 255);
if (contours.size() > 0)
{
drawContours(iRoiSRC, contours, biggestContourIndex, colorOne, 2, 8, hierarchy, 0, Point());
drawContours(iRoiSRC, hullsP, 0, colorTwo, 1, 8, vector<Vec4i>(), 0, Point());
rectangle(iRoiSRC, boundingRect(contours[biggestContourIndex]), Scalar(0, 255, 0), 1, 8, 0);
}
imshow("src", src);
if (waitKey(waitTime) >= 0) break;
}
return(0);
}