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++_Opencv - Fatal编程技术网

从矢量字符串读取并整理多个图像,获取错误:“矢量下标超出范围”[c++]

从矢量字符串读取并整理多个图像,获取错误:“矢量下标超出范围”[c++],c++,opencv,C++,Opencv,嘿,我尝试加载文件夹中的所有图像,然后将它们拉直,然后将所有新图像写入新文件夹。我的代码可以工作,但不是所有的都很好。在4-5张图像上,程序崩溃,我收到错误消息: 调试评估失败。。。行:1201表达式:向量下标超出范围 这是我的部分代码: int main() { system("dir Klasa_pierwsza\\*.tiff /b > lista_zdjęć.txt"); add_list_of_names_images_tiff_to_string_vector("lista_z

嘿,我尝试加载文件夹中的所有图像,然后将它们拉直,然后将所有新图像写入新文件夹。我的代码可以工作,但不是所有的都很好。在4-5张图像上,程序崩溃,我收到错误消息:

调试评估失败。。。行:1201表达式:向量下标超出范围

这是我的部分代码:

int main()
{
system("dir Klasa_pierwsza\\*.tiff /b > lista_zdjęć.txt");
add_list_of_names_images_tiff_to_string_vector("lista_zdjęć.txt", lista);
display(lista);

std::vector<cv::Point> wektor_straighten_images2;

cv::Mat *M = new Mat[lista.size()];

for (int i = 0; i < lista.size(); i++)
{

    M[i] = imread("Klasa_pierwsza\\" + lista[i]);

    cv::cvtColor(M[i], bw, CV_BGR2GRAY);
    cv::blur(bw, bw, cv::Size(3, 3));
    cv::Canny(bw, bw, 100, 100, 3); // 200

    std::vector<cv::Vec4i> lines;
    cv::HoughLinesP(bw, lines, 1, CV_PI / 180, 70, 30, 10);
    cv::Vec4i v1 = lines[3]; // lines[2,5,10

    wektor_straighten_images2.push_back(cv::Point(v1[0], v1[1]));
    wektor_straighten_images2.push_back(cv::Point(v1[2], v1[3]));

    cv::line(M[i], cv::Point(v1[0], v1[1]), cv::Point(v1[2], v1[3]), CV_RGB(0, 255, 0)); // rysowanie linii na obrazku im0

    double angle = std::atan((double)(wektor_straighten_images2[0].y - wektor_straighten_images2[1].y) / (wektor_straighten_images2[0].x - wektor_straighten_images2[1].x)) * (180 / CV_PI);

    cv::Point2f center(M[i].cols / 2., M[i].rows / 2.);
    cv::Mat dst, r = cv::getRotationMatrix2D(center, angle, 1.0);
    cv::warpAffine(M[i], dst, r, M[i].size());

    cv::imwrite("Zapisane\\" + lista[i], dst);
}
这是我的函数添加\列表\名称\图像\ tiff\到\字符串\向量

void add_list_of_names_images_tiff_to_string_vector(String k,vector<string> &wektor)
{
ifstream in(k);
    if (!in) 
    {
        cout << "Can't read.\n";
    }
char str[255];

    while (in) 
    {
        in.getline(str, 255);
        wektor.push_back(str);
    }
    wektor.pop_back();

in.close();
}
也许有人能给我一些好的建议。请帮忙

我为什么这样做我必须创建程序来理顺文件夹中的所有图像,但图像的名称未知

编辑:

嗯,问题是: cv::Vec4i v1=行[3]


但是什么样的问题呢?

代码中的一个问题是,您从不检查操作的结果,应该有:

M[i] = imread("Klasa_pierwsza\\" + lista[i]);
if ( M[i].empty() )
{
     cerr << "Klasa_pierwsza\\" + lista[i] << " could not be loaded !" << endl;
     continue;
}

// ...

std::vector<cv::Vec4i> lines;
cv::HoughLinesP(bw, lines, 1, CV_PI / 180, 70, 30, 10);
if ( lines.size() < 4 )
{
     cerr << "Klasa_pierwsza\\" + lista[i] << " did not have 4 lines !" << endl;
     continue;
}
cv::Vec4i v1 = lines[3]; // you have an access violation (out of bounds) here.

在执行弹出检查之前,请找出引发错误的行并相应地修复您的逻辑向量不为空,并且当使用[]检查索引在范围内时,请不要对函数、文件名或注释使用您的母语或字符集。这里的人无法读取它,而且imread在非ascii文件名上也会失败。Berak很好的说明我纠正了它。另外,opencv有一个很好的遍历目录和检索向量的功能。最好不要在那里玩你自己的游戏!太好了,谢谢:我明白我的问题了,是4号、7号和10号图像的问题: