Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
C++ 错误:调试断言失败。C++;向量下标超出范围_C++_Opencv_Vector - Fatal编程技术网

C++ 错误:调试断言失败。C++;向量下标超出范围

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

我收到错误:Opencv.exe中0x00007FF89F84AFEC(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;
}
#包括
#包括
#包括
#包括
使用名称空间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中使用调试库运行该程序--同样的错误。这是问题的第二组
[]
,而不是第一组。请在线搜索错误以了解其含义。另外,你需要在你的问题中提取并提供一个答案,如果没有它,这是离题的。作为一个新用户,也请阅读。谢谢我会做的