2014-12-31 5 views
-4

안녕하세요, 모든 이미지를 폴더에서로드 한 다음 곧게 펴서 새 이미지를 모두 새 폴더에 쓰려고합니다. 내 코드는 작동하지만 모든 것이 정상적인 것은 아닙니다. 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];

하지만 어떤 종류의 문제입니까? 코드에서 문제

+0

오류를 던지고있는 라인을 찾아'와 pop_back를 수행하기 전에 그에 따라 –

+0

당신의 논리를 수정 'check vector가 비어 있지 않고'[]'를 사용할 때 check index가 범위 –

+0

에있는 경우, 함수, 파일 이름 또는 주석을 위해 모국어 또는 문자 집합을 사용하지 마십시오. 여기 사람들은 그것을 읽을 수 없으며 imread()는 ASCII가 아닌 파일 이름에서도 실패합니다. – berak

답변

0

하나는 당신이 당신의 작업의 결과를 확인 결코이며,이 있어야한다 :

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. 
+0

슈퍼, 고맙다. 내 문제를 본다. 숫자 4, 7, 10의 이미지에 문제가있다. :) –

관련 문제