안녕하세요, 모든 이미지를 폴더에서로드 한 다음 곧게 펴서 새 이미지를 모두 새 폴더에 쓰려고합니다. 내 코드는 작동하지만 모든 것이 정상적인 것은 아닙니다. 4-5 이미지에 프로그램은 추락하고 나는 다시 오류 메시지 :벡터 문자열에서 여러 이미지를 읽고 바로 잡기 : "벡터 아래 첨자가 범위를 벗어났습니다."[C++]
"디버그 Asseration 실패 (...) 라인! 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);
}
이 제 기능 "add_list_of_names_images_tiff_to_string_vector는"
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();
}
어쩌면 누군가가 나를 위해 좋은 조언을합니다. 도와주세요.
왜 이렇게합니까? : 폴더에서 모든 이미지를 정리하는 프로그램을 만들어야하지만 이미지의 이름은 알 수 없습니다.
EDIT :
흠 문제는 여기 : CV Vec4i :: = V1 라인 [3];
하지만 어떤 종류의 문제입니까? 코드에서 문제
오류를 던지고있는 라인을 찾아'와 pop_back를 수행하기 전에 그에 따라 –
당신의 논리를 수정 'check vector가 비어 있지 않고'[]'를 사용할 때 check index가 범위 –
에있는 경우, 함수, 파일 이름 또는 주석을 위해 모국어 또는 문자 집합을 사용하지 마십시오. 여기 사람들은 그것을 읽을 수 없으며 imread()는 ASCII가 아닌 파일 이름에서도 실패합니다. – berak