从矢量字符串读取并整理多个图像,获取错误:“矢量下标超出范围”[c++]
嘿,我尝试加载文件夹中的所有图像,然后将它们拉直,然后将所有新图像写入新文件夹。我的代码可以工作,但不是所有的都很好。在4-5张图像上,程序崩溃,我收到错误消息: 调试评估失败。。。行:1201表达式:向量下标超出范围 这是我的部分代码:从矢量字符串读取并整理多个图像,获取错误:“矢量下标超出范围”[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
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号图像的问题: