C++ 错误:调试断言失败。C++;向量下标超出范围
我收到错误:Opencv.exe中0x00007FF89F84AFEC(ucrtbased.dll)处存在未处理的异常:向认为无效参数致命的函数传递了无效参数C++ 错误:调试断言失败。C++;向量下标超出范围,c++,opencv,vector,C++,Opencv,Vector,我收到错误:Opencv.exe中0x00007FF89F84AFEC(ucrtbased.dll)处存在未处理的异常:向认为无效参数致命的函数传递了无效参数 #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream> using namespace cv; using name
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat imgOriginal, imgDialate, imgCanny, imgGray, imgBlur;
vector<Point> initialPoints, docPoints;
Mat preProcessing(Mat img)
{
cvtColor(img, imgGray, COLOR_BGR2GRAY);
GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0);
Canny(imgBlur, imgCanny, 25, 75);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imgCanny, imgDialate, kernel);
return imgDialate;
}
vector<Point> reorder(vector<Point> points)
{
vector<Point> newPoints;
vector<int> sumPoints, subPoints; //**vector subscript out of range**
for (int i = 0; i < 4; i++)
{
sumPoints.push_back(points[i].x + points[i].y);
subPoints.push_back(points[i].x - points[i].y);
}
newPoints.push_back(points[min_element(sumPoints.begin(), sumPoints.end()) - sumPoints.begin()]);
newPoints.push_back(points[max_element(subPoints.begin(), subPoints.end()) - subPoints.begin()]);
newPoints.push_back(points[min_element(subPoints.begin(), subPoints.end()) - subPoints.begin()]);
newPoints.push_back(points[max_element(sumPoints.begin(), sumPoints.end()) - sumPoints.begin()]);
return newPoints;
}
int main()
{
string path = "resource/document2.jpg";
imgOriginal = imread(path);
resize(imgOriginal, imgOriginal,Size(360,360));
//image processing
imgDialate = preProcessing(imgOriginal);
//Get contours
initialPoints = getContours(imgDialate);
//draw points
docPoints = reorder(initialPoints);
drawPoints(docPoints, Scalar(0, 0, 255));
imshow("imgOrignal", imgOriginal);
imshow("imgDialate", imgDialate);
waitKey(0);
return 0;
}
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
Mat imgOriginal、imgDialate、imgCanny、imgGray、imgBlur;
向量初始点,docPoints;
Mat预处理(Mat img)
{
CVT颜色(img、imgGray、颜色为灰色);
GaussianBlur(imgGray,imgBlur,大小(3,3,0));
Canny(imgBlur,imgCanny,25,75);
Mat kernel=getStructuringElement(变形,大小(3,3));
扩张(imgCanny,imgDialate,kernel);
返回imgDialate;
}
矢量的代码显示了错误
vector<Point> getContours(Mat image)
{
vector< vector<Point >> contours;
vector<Vec4i> hierarchy;
findContours(image, contours, hierarchy ,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
vector<vector<Point >> conPoly(contours.size());
vector<Rect> boundRect(contours.size());
vector<Point> biggest;
int maxArea = 0;
for (int i = 0; i < contours.size(); i++)
{
int area = contourArea(contours[i]);
//cout << area << endl;
string objectType;
if (area > 1000)
{
float peri = arcLength(contours[i], true);
approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);
if (area > maxArea && conPoly[i].size() == 4)
{
drawContours(imgOriginal, conPoly, i, Scalar(255, 0, 255, 5));
biggest = { conPoly[i][0],conPoly[i][1] , conPoly[i][2] , conPoly[i][3] };
maxArea = area;
}
}
}
return biggest;
}
void drawPoints(vector<Point> points, Scalar color)
{
for (int i = 0; i < points.size(); i++)
{
circle(imgOriginal, points[i], 10, color, FILLED);
putText(imgOriginal, to_string(i), points[i], FONT_HERSHEY_PLAIN, 4, color, 4);
}
}
vector getContours(Mat图像)
{
矢量<矢量>等高线;
向量层次;
findContours(图像、轮廓、层次、外部重现、链近似、简单);
向量conPoly(contours.size());
向量boundRect(contours.size());
向量最大;
int maxArea=0;
对于(int i=0;i
这里我将向量起始索引设置为0,但它仍然显示错误
Opencv.exe中0x00007FF89EA7AFEC(ucrtbased.dll)处未处理的异常:向认为无效参数是致命参数的函数传递了无效参数
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat imgOriginal, imgDialate, imgCanny, imgGray, imgBlur;
vector<Point> initialPoints, docPoints;
Mat preProcessing(Mat img)
{
cvtColor(img, imgGray, COLOR_BGR2GRAY);
GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0);
Canny(imgBlur, imgCanny, 25, 75);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imgCanny, imgDialate, kernel);
return imgDialate;
}
vector<Point> reorder(vector<Point> points)
{
vector<Point> newPoints;
vector<int> sumPoints, subPoints; //**vector subscript out of range**
for (int i = 0; i < 4; i++)
{
sumPoints.push_back(points[i].x + points[i].y);
subPoints.push_back(points[i].x - points[i].y);
}
newPoints.push_back(points[min_element(sumPoints.begin(), sumPoints.end()) - sumPoints.begin()]);
newPoints.push_back(points[max_element(subPoints.begin(), subPoints.end()) - subPoints.begin()]);
newPoints.push_back(points[min_element(subPoints.begin(), subPoints.end()) - subPoints.begin()]);
newPoints.push_back(points[max_element(sumPoints.begin(), sumPoints.end()) - sumPoints.begin()]);
return newPoints;
}
int main()
{
string path = "resource/document2.jpg";
imgOriginal = imread(path);
resize(imgOriginal, imgOriginal,Size(360,360));
//image processing
imgDialate = preProcessing(imgOriginal);
//Get contours
initialPoints = getContours(imgDialate);
//draw points
docPoints = reorder(initialPoints);
drawPoints(docPoints, Scalar(0, 0, 255));
imshow("imgOrignal", imgOriginal);
imshow("imgDialate", imgDialate);
waitKey(0);
return 0;
}
Opencv.exe中0x00007FF89EA7AFEC(ucrtbased.dll)处未处理的异常:向认为无效参数是致命参数的函数传递了无效参数
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat imgOriginal, imgDialate, imgCanny, imgGray, imgBlur;
vector<Point> initialPoints, docPoints;
Mat preProcessing(Mat img)
{
cvtColor(img, imgGray, COLOR_BGR2GRAY);
GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0);
Canny(imgBlur, imgCanny, 25, 75);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imgCanny, imgDialate, kernel);
return imgDialate;
}
vector<Point> reorder(vector<Point> points)
{
vector<Point> newPoints;
vector<int> sumPoints, subPoints; //**vector subscript out of range**
for (int i = 0; i < 4; i++)
{
sumPoints.push_back(points[i].x + points[i].y);
subPoints.push_back(points[i].x - points[i].y);
}
newPoints.push_back(points[min_element(sumPoints.begin(), sumPoints.end()) - sumPoints.begin()]);
newPoints.push_back(points[max_element(subPoints.begin(), subPoints.end()) - subPoints.begin()]);
newPoints.push_back(points[min_element(subPoints.begin(), subPoints.end()) - subPoints.begin()]);
newPoints.push_back(points[max_element(sumPoints.begin(), sumPoints.end()) - sumPoints.begin()]);
return newPoints;
}
int main()
{
string path = "resource/document2.jpg";
imgOriginal = imread(path);
resize(imgOriginal, imgOriginal,Size(360,360));
//image processing
imgDialate = preProcessing(imgOriginal);
//Get contours
initialPoints = getContours(imgDialate);
//draw points
docPoints = reorder(initialPoints);
drawPoints(docPoints, Scalar(0, 0, 255));
imshow("imgOrignal", imgOriginal);
imshow("imgDialate", imgDialate);
waitKey(0);
return 0;
}
矢量重新排序(矢量点)
{
向量新点;
向量和点,子点;//**向量下标超出范围**
对于(int i=0;i<4;i++)
{
sumPoints.push_back(点[i].x+点[i].y);
子点。推回(点[i].x-点[i].y);
}
newPoints.push_back(points[min_元素(sumPoints.begin(),sumPoints.end())-sumPoints.begin());
newPoints.push_back(points[max_元素(subPoints.begin(),subPoints.end())-subPoints.begin());
newPoints.push_back(points[min_元素(subPoints.begin(),subPoints.end())-subPoints.begin());
newPoints.push_back(points[max_元素(sumPoints.begin(),sumPoints.end())-sumPoints.begin());
返回新点;
}
int main()
{
string path=“resource/document2.jpg”;
imgOriginal=imread(路径);
调整大小(imgOriginal,imgOriginal,Size(360360));
//图像处理
imgDialate=预处理(imgOriginal);
//获得轮廓
初始点=获取轮廓(imgDialate);
//抽签
docPoints=重新排序(初始点);
绘图点(docPoints,标量(0,0,255));
imshow(“imgOrignal”,imgOriginal);
imshow(“imgDialate”,imgDialate);
等待键(0);
返回0;
}
您必须更改重新订购代码
进行类似(0,0255),5)的更改这里我将向量起始索引设置为0,但它仍然显示错误——如果向量为空,即使索引
0
也无效。您是否检查了empty()
?我看不到您在哪里向conPoly[I]
添加项目,因此conPoly[I][0]
是有效的。vector reorder(vector points)
不是您的错误,但请将其更改为vector reorder(const vector&points)
,这将避免不必要的副本。conPoly[I][0],conPoly[I][1]。。在轮廓中使用conPoly[i][0],conPoly[i][1]在轮廓中使用--conPoly[i]
没有任何元素,但您正在访问元素0。您甚至不需要所有这些代码来复制错误:int main(){std::vector v(10);v[0][0]=1;}
--在visual studio中使用调试库运行该程序--同样的错误。这是问题的第二组[]
,而不是第一组。请在线搜索错误以了解其含义。另外,你需要在你的问题中提取并提供一个答案,如果没有它,这是离题的。作为一个新用户,也请阅读。谢谢我会做的