2016-10-02 3 views
-1

현재 점의 벡터 끝에 새로운 점을 추가하는 데 문제가 있습니다. 그것이 현재하고있는 것은 내가 추가하려고하는 새로운 점으로 기존의 벡터를 덮어 쓰는 것입니다. Push_back은 벡터에 새 것을 추가하는 대신 현재 점을 대체합니다.

클래스 정의 (.H 파일)입니다 :

class person 
{ 
public: 
    person(); 
    ~person(); 

    int ID; 
    std::vector<cv::Point> history; 

    void addposition(cv::Point); 
    void person::drawhistory(cv::Mat*,std::vector<cv::Point>); 
}; 

그리고이 얼마나 클래스의 .cpp 파일에 나타나는 함수 선언 :

person::person() 
{ 
} 

person::~person() 
{ 
} 

void person::addposition(cv::Point inpt) { 
    std::cout << "Adding a position ----" << std::endl; 
    std::cout << "Pushing inpt.x: " << inpt.x << std::endl; 
    std::cout << "Pushing inpt.y: " << inpt.y << std::endl; 
    history.push_back(inpt); 
    std::cout << "Current Size: " << history.size() << std::endl; 
    if (history.size()>15) 
    { 
     history.erase(history.begin()); 
    } 
} 

void person::drawhistory(cv::Mat* image, std::vector<cv::Point> hist) { 
    cv::Point pt; 
    for (cv::Point const& pt : hist) 
    { 
     std::cout << "Printing the History" << std::endl; 
     std::cout << "Current Pt.x: " << pt.x << std::endl; 
     std::cout << "Current Pt.y: " << pt.y << std::endl; 
     cv::circle(*image, pt, 5, cv::Scalar(0, 0, 0), -1); 
    } 
} 

그리고 이것이 이 두 함수가 main 함수에서 어떻게 호출되는지.

vector<RECT> detectBox

를하고 올바르게 프레임에 필요한 사항을 저장하고, 그래서 문제의 원인이 아니라고 확신 메신저 : detectBox 같은 선언합니다

for (RECT const& rect : *detectBox) 
{ 
     std::cout << "Inside the LOOOOOP" << std::endl; 
     //This is simply finding the middle point of the rectangle currently stored in detectBox   
     pt.y = (rect.bottom + rect.top)/2; 
     pt.x = (rect.left + rect.right)/2; 

    person personn; 
    personn.addposition(pt); 
    personn.drawhistory(&img_8bit, personn.history); 

    cv::circle(img_8bit, pt, 3, cv::Scalar(255, 255, 0), -1); 
} 
cv::imshow("8Bit", img_8bit); 

포인트를 벡터에 밀어 넣는 것은 간단하지만 벡터의 바닥에 새 포인트를 추가하지 않는 것이 좋을 것이라고 생각합니다. 또한 저장된 포인트 수를 15로 유지하는 지우기 단계를 추가했음을 유의하십시오.

클래스 정의에있는 함수에 문제가 있거나 클래스에 새로운 기능이 있습니까? 메인 루프에서 함수 호출?

+1

루프를 통해 매번 '사람'의 새 인스턴스를 만듭니다. 그러한 각각의 인스턴스는 태어 났고, 단일 포인트가 추가 된 다음 죽습니다. 루프 밖에서 변수를 선언하십시오. –

+0

왜냐하면 나는 _history_의 현재 크기를 인쇄 할 때만 1의 크기를 되돌려주기 때문입니다. 나는 벡터가 가장 최근의 15 점까지 작성 될 것으로 기대하고 있습니다. –

답변

2

이것은 당신이하고 싶지 무엇을 가능성이 높습니다 : 따라서 각 반복에 당신이 새로운 person를 생성 한 위치와 인쇄를 추가,

person personn; 
personn.addposition(pt); 
personn.drawhistory(&img_8bit, personn.history); 

귀하의 presonn는 루프의 몸에 지역입니다 . 루프 외부에 personn을 선언하십시오.

PS : 문제의 mcve는 다음과 같이 수 :

#include <vector> 
#include <iostream> 
int main() { 
    for (int i=0; i<5; i++) { 
     std::vector<int> vect; 
     vect.push_back(i); 
     std::cout << vect.size() << std::endl; 
    } 
} 

그것은 당신이 겪고있는 문제, 그것은 컴파일하고 그렇게하는 것이 필요한 경우에만 최소한의 코드가 재현합니다. 자신을 만들었다면 아마 실수를 스스로 발견했을 것입니다. 물론 오류의 원인을 찾기가 항상 쉽지는 않습니다. 디버거가 잘못된 위치를 찾는 데 도움이 될 수 있습니다.

+0

프로그램이 꽤 크기 때문에 모든 것을 추가하는 것은 불필요 할 것입니다. 문제는 지금 다시 만들어보십시오. –

+0

@JamesMallett가 대답을 편집하여 mcve가 – user463035818

+0

과 같이 보일 수있는 것을 보여주었습니다. 도움과 조언에 감사드립니다. 확실히 내 미래의 질문에 이것을 할 것입니다. –

관련 문제