2012-02-05 3 views
4

포인터 데이터를 다른 포인터로 복사하려고하므로 하나를 변경하면 다른 포인터의 값이 변경되지 않습니다.포인터의 복사본을 만드는 방법

두 구조체 포인터, 값 및 lastValue가있는 루프를 코딩 중이므로이 코드가 필요합니다. 루프 반복마다 value의 내용을 lastValue에 할당하고 value을 새 내용으로 채 웁니다. 문제는 두 가지 모두 구조체 포인터이기 때문에 value을 변경하면 lastValue도 변경되며 원하는 동작이 아니기 때문입니다. 코드는 다음과 같이합니다 (구조체는 OpenCV의에서 IplImages이다)를 다음과 같습니다

IplImage *value; 
Iplimage *lastValue; 
while(1) 
{ 
    lastValue=value; 
    value=cvQueryFrame(capture);//This fills the struct with new information 
} 

가 정상 구조체 어디서 경우 작동,하지만 그들은 포인터이기 때문에, 모두 같은 값으로 끝낸다. 동일한 값을 가지고 있지만 주소가 다른 포인터의 사본을 얻을 수있는 방법이 있습니까? 내가 값을 변경할 때

+0

는'이력서 :: Mat'가'클론을 제공합니다()'방식 – Vyktor

답변

1

기능 cvQueryFrame 카메라 또는 비디오 파일에서 프레임을 잡고 압축을 풀고 그것을 반환합니다. 마지막으로 움켜 잡은 프레임이있는 내부 OpenCV 버퍼에 대한 포인터를 반환합니다. 이것이 당신이 동일한 가치를 얻는 이유입니다. 2 프레임을 원하면 이미지 사본을 만들어야합니다.

IplImage * previousFrame, *currentFrame ; 
CvCapture* video = cvCaptureFromAVI("video.avi"); 
currentFrame = cvQueryFrame(video); 

// COPY IMAGE 
previousFrame = cvCloneImage(currentFrame); 

while(currentFrame = cvQueryFrame(video)) 
{ 
    //... 
    cvCopy(currentFrame , previousFrame); 
} 
//... 
2
value=cvQueryFrame(capture); 

는 lastValue 너무

아니,하지 않습니다 변경됩니다. 포인터 value은 원하는대로 덮어 쓰게됩니다. 이 코드 행은 lastValue에 영향을 미치지 않습니다. 그들은 포인터 때문에

하지만, 모두 같은 값

아니, 그들이 포인터 것을 중요하지 않습니다와 끝까지. 포인터는 그 자체의 객체입니다. 장치에 의해 캡처 된 이미지가 캡처 기능에 의해 발표/할당되어

참고 :


그러나, cvQueryFrame이 같은 you shall not modify or free 당신을 위해 수행되는 버퍼에 대한 포인터를 반환합니다. 명시 적으로 해제 할 필요는 없습니다. the documentation 비록

는 버퍼 (다음 할당 된 메모리를 다시 사용합니다) cvQueryFrame에 대한 다음 호출이있을 때까지 만 유효 함을 나에게 보인다, 약간 불분명하다. 따라서 lastValue은 변경할 수없고 변경하지 않더라도 이되어 새 프레임을 가리키게됩니다.

이 해결하기 위해

, 당신은 명시 적으로 lastValue 지점에있는 개체를 복사 할 수 있습니다 : 이제

lastValue = cvCloneImage(value); 

당신은 아마 그것을 해제에 대한 책임에 걸릴을 (그러나 다시는 나의 피상적 눈에서 완전히 명확하지 않다 문서) :

cvReleaseImage(&lastValue); 
+0

확인 아, 내가 루프의 끝을 확인하는 경우 lastvalue == 값이 true로 해석하기 때문에 lastValue도 변경 문질러서. 나는 여전히 OpenCV의 초보자이며 lastvalue가 같은 가치의 가치로 끝나는 이유를 완전히 이해하지 못했지만 문제를 해결하기 위해 cvCloneImage()를 사용할 것입니다. 감사합니다. – XaitormanX

+0

@ user1190588 : 그러면'cvQueryFrame'의 디자인에 의해 메모리 영역이 비디오 프레임에 사용됩니다. :)'lastValue'는 변경되지 않았지만 그것이 가리키는 곳이 _new_ 프레임 데이터의 동일한 위치이기 때문에 반드시 필요하지는 않습니다. –

+0

감사합니다. 지금 이해합니다. cvCloneImage는 잘 작동하지만 cvReleaseImage (& lastValue)를 사용하면 프로그램이 충돌하여 이미지를 수동으로 릴리즈 할 필요가 없습니다. – XaitormanX

0

당신이 옳은 일을하고있는 것처럼 보입니다.

last_value = value; //copy pointer 

하지만 복사하려는 포인터가 아니기 때문에 실제로 원하는 것은 아닙니다. 내부의 데이터입니다.그래서 이전 포인터가 새 포인터와 함께 업데이트됩니다. 당신이 필요로하는 것은 구조 그 자체의 복사본입니다. 당신이 쓰는 몇 가지 클래스에 대한 포인터 포인트, 그것을 복사 생성자 메서드를 추가하는 경우

는 다음과 같이 포인터의 값을 복사 :

last_value = new MyClass(*value); //construct object, copy from what value points to 
//change value 
+0

이전 포인터가 전혀 업데이트되지 않았습니다. 그리고 그는 수업을 소유하지 않습니다. 그렇지 않으면 정확합니다. –

관련 문제