opencv에서 객체를 추적 한 결과 포인트 목록을 저장하고 싶습니다.
이 목록을 활용합니다
list<list<OrganismPosition*>> trackList;
목록과 en 요소를 삽입합니다.
list<OrganismPosition*> sublist;
trackList.push_back(sublist);
list<list<OrganismPosition*>>::iterator itList=trackList.end();
itList--;
OrganismPosition* pos=new OrganismPosition();
//in this method I create a new point
pos->setCenter(&box.center);//Here the point pos->center is (640,550)
itList->push_front(pos);//Error here the point pos->center has value (-103412,-102342)
오류는 목록에 개체를 추가 할 때 속성 "중심"의 값이 임의의 값으로 변경된다는 것입니다. 문제는 무엇이며 어떻게 해결합니까? 목록이 클래스의 복사 생성자를 호출한다는 것을 읽었으므로 속성의 올바른 값을 복사하기 위해 이것을 구현했지만 여전히 작동하지 않습니다. 도움을 주셔서 감사합니다. 감사
내 수업 OrganismPosition :
class OrganismPosition
{
CvPoint2D32f* center;//center point of organisme tracked
CvPoint2D32f* head;//head point of organisme tracked
CvPoint2D32f* queue;//first point of organisme tracked
CvPoint2D32f* skel1;//second point of organisme tracked
CvPoint2D32f* skel2;//third point of organisme tracked
CvPoint2D32f* skel3;//fourth point of organisme tracked
CvPoint2D32f* skel4;//fiveth point of organisme tracked
public:
OrganismPosition(void);
~OrganismPosition(void);
OrganismPosition( const OrganismPosition& other );
void setCenter(CvPoint2D32f* center);
CvPoint2D32f* getCenter();
void setHead(CvPoint2D32f* head);
CvPoint2D32f* getHead();
void setQueue(CvPoint2D32f* queue);
CvPoint2D32f* getQueue();
void setSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4);
void getSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4);
};
Class OrganismPosition.cpp :
OrganismPosition::OrganismPosition(void)
{
}
OrganismPosition::~OrganismPosition(void)
{
}
OrganismPosition::OrganismPosition( const OrganismPosition& other )
{
OrganismPosition::center->x=other.center->x;
OrganismPosition::center->y=other.center->y;
OrganismPosition::head->x=other.head->x;
OrganismPosition::head->y=other.head->y;
}
void OrganismPosition::setCenter(CvPoint2D32f* center){
CvPoint2D32f newcenter=cvPoint2D32f(center->x,center->y);
this->center=&newcenter;
}
CvPoint2D32f* OrganismPosition::getCenter(){
return this->center;
}
void OrganismPosition::setHead(CvPoint2D32f* head){
CvPoint2D32f newhead=cvPoint2D32f(head->x,head->y);
this->head=&newhead;
}
CvPoint2D32f* OrganismPosition::getHead(){
return this->head;
}
void OrganismPosition::setQueue(CvPoint2D32f* queue){
CvPoint2D32f newqueue=cvPoint2D32f(queue->x,queue->y);
this->queue=&newqueue;
}
CvPoint2D32f* OrganismPosition::getQueue(){
return this->queue;
}
void OrganismPosition::setSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4){
CvPoint2D32f newskel1=cvPoint2D32f(skel1->x,skel1->y);
this->skel1=&newskel1;
CvPoint2D32f newskel2=cvPoint2D32f(skel2->x,skel2->y);
this->skel2=&newskel2;
CvPoint2D32f newskel3=cvPoint2D32f(skel3->x,skel3->y);
this->skel3=&newskel3;
CvPoint2D32f newskel4=cvPoint2D32f(skel4->x,skel4->y);
this->skel4=&newskel4;
}
void OrganismPosition::getSkel(CvPoint2D32f* skel1,
CvPoint2D32f* skel2,
CvPoint2D32f* skel3,
CvPoint2D32f* skel4){
skel1=this->skel1;
skel2=this->skel2;
skel3=this->skel3;
skel4=this->skel4;
}
몇 가지 실수. 먼저 pos->center
문제를 해결하겠습니다.
void OrganismPosition::setCenter(CvPoint2D32f* center){
CvPoint2D32f newcenter=cvPoint2D32f(center->x,center->y);
// you've created a local 2f object that resides on the stack.
//this will be destroyed when the function returns.
this->center=&newcenter;
// what you're left with is a stack pointer to garbage data.
}
원하는 것은 힙에 메모리를 할당하는 것입니다.
void OrganismPosition::setCenter(const CvPoint2D32f* center){
if (center)
delete center; // free memory that you used up before.
this->center= new cvPoint2D32f(center->x,center->y);
}
자, 왜 처음부터이 모든 포인터 두통을 겪을까요? 수업 CvPoint2D32f
에서 멤버를 사용 하십시오 OrganismPosition
. 꼭 필요한 경우가 아니면 포인터를 만들지 마십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다