2014-11-13 2 views
-1

OpenCV를 사용하여 비디오를 r, g 색도로 프레임 단위로 변환 한 다음 비교를 위해 히스토그램으로 변환하는 코드를 작성하려고합니다. 그러나 벡터 또는 행렬에 허용되지 않는 일부 연산에 문제가 있습니다 (반대의 경우도 마찬가지입니다).벡터 첨자가 범위를 벗어났습니다. opencv C++

Mat src, res, out, hsv_vid; 
vector<Mat> spl; 
Mat spl_r, spl_g, spl_b; 
Mat r_chroma, g_chroma, frame_chroma; 

for(;;){ 
    cap1 >> src; //read video frame into src matrix 
    if (src.empty()) break; 

    //extract channels 
    split(src, spl); 
    spl_r = spl[2]; 
    spl_g = spl[1]; 
    spl_b = spl[0]; 

    //convert whole frame to chromaticity 
    r_chroma = spl_r/(spl_r + spl_g + spl_b); 
    g_chroma = spl_g/(spl_r + spl_g + spl_b); 

    //convert matrix to vector 
    vector<vector<Mat>> r_chroma_vec; 
    for (int i = 0; i < r_chroma.rows; i++) { 
     vector<Mat> row;  
     r_chroma.row(i).copyTo(row); 
     r_chroma_vec.push_back(row); 
    } 
    vector<vector<Mat>> g_chroma_vec; 
    for (int i = 0; i < g_chroma.rows; i++) { 
     vector<Mat> row;  
     g_chroma.row(i).copyTo(row); 
     g_chroma_vec.push_back(row); 
    } 

    merge(r_chroma_vec, frame_chroma); 
    merge(g_chroma_vec, frame_chroma); 

} //end for(;;) 

//disp chromaticity test img 
vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //use .PNG compression 
compression_params.push_back(9); 
try { imwrite("ChromaTest.png", frame_chroma, compression_params); } //write output matrix to file 
catch (runtime_error& ex) { return -2; } 

내가 & g_chroma이 행렬해야 r_chroma 다음 내 색도를 얻을 수있는 부문을 & 추가 할 수 있기를 원한다면, 내가 그들을 병합 할 수 없습니다. 벡터로 r_chroma & g_chroma가 있으면 병합 할 수는 있지만 수학 연산을 수행 할 수 없습니다.

2 개의 행렬을 병합 할 수있는 방법이 있습니까? 아니면이 방법이 잘못 될까요? 누군가가 올바른 방향으로 나를 가리킬 수 있다면 고맙겠습니다.

읽어 주셔서 감사합니다.

[편집] : 매트릭스 -> 벡터 변환을 추가하여 매트릭스 출력 병합을 가능하게했습니다.

+1

'Range'의 벡터 첨자 아웃이 당신이 벡터의 범위를 벗어날 항목에 액세스하는 것을 의미한다. 배열을 사용했다면 같은 오류 (런타임에서 충돌이나 침묵)가 발생했을 것입니다. 그래서 그것은'std :: vector' 문제가 아닙니다. – PaulMcKenzie

+0

@PaulMcKenzie 아직 그것을 실행하지 않았습니다. 일부 작업은 행렬/벡터 (예 : 병합)에서 허용되지 않기 때문에 VS2012는 단지 빨간색 밑줄을 제공합니다. 하지만 spl []에 경계 오류가 있다고 말하는 것입니까? – user1846359

+0

어쩌면 그것의 다만 저, 그러나 이것을위한 루프는 닫는 부류가 있는가? 아마도 스 니펫 대신 모든 코드를 표시해야 할 것입니다. –

답변

1

cv::merge은 cv :: split의 대응 부분이고, 첫 번째 인수는 vector<Mat> 또는 Mat []입니다. 두 번째 인수는 결과 Mat입니다.

그래서 args가 잘못되었습니다.

r_chroma = spl_r/(spl_r + spl_g + spl_b); 

그래, 당신은 수학 연산자를 사용할 수 있지만, (spl_r + spl_g + spl_b)이 결과 매트는 여전히 UCHAR 하나, 포화됩니다

당신의 접근 방식에서 또 다른 문제

이 부분입니다.

[편집] : 1은 벡터 문제를 해결에서 시도 :

vector<Mat> spl_new; 
spl_new.push_back(spl_b); // <-- ??? 
spl_new.push_back(g_chroma); 
spl_new.push_back(r_chroma); 

Mat result; 
merge(spl_new, result); 
+0

흠. 내 r_chroma & g_chroma가 벡터 이어야한다고 말하고 있습니까? 그러나 그렇다면 추가와 나누기를 할 수 없습니다. 또한 r을 사용할 수 없다면, g = R, G/(R + G + B) 그러면 색도를 얻는 방법은 무엇입니까? 지금까지 도움을 주셔서 감사합니다 :) – user1846359

+0

아니, 당신은 벡터로 그들을 포장해야합니다. 결과 그림의 세 번째 (b) 채널은 무엇입니까? 원래 하나? – berak

+0

게시물을 수정했습니다. for 루프를 사용하여 수학 연산의 결과 인 Matrix를 벡터에 넣어 출력 배열에 병합 할 수있었습니다.하지만 범위를 벗어난 오류가 발생합니다. 나는 아직도 그 일을해야 해. 하지만 지금까지 어떻게 생각하니? – user1846359

관련 문제