여기서는 처음으로 shared_ptr을 사용하려고하는데 여기에 문제가 있습니다.각 프레임의 shared_ptr에 이미지를 동적으로 할당하십시오.
모든 프레임마다 IplImage를 받고 shared_ptr 클래스 멤버에 할당하여 마지막 이미지를 릴리스하려고합니다. 이것은 다음과 같습니다.
class Detector {
public:
void Detector::updateImage {
main_image_.reset(cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3));
}
private:
boost::shared_ptr<IplImage> main_image_;
}
나는 루프에서 updateImage를 호출합니다. cvCreateImage는 해당 이미지 크기에 대해 일부 메모리를 동적으로 할당합니다.
처음으로 루프가 실행되면 모든 것이 정상적으로 작동합니다. 이제 두 번째 _BLOCK_TYPE_IS_VALID 어설 션 오류가 발생합니다. 이것은 shared_ptr이 포인터를 삭제하려 할 때 발생합니다. 내가 뭔가 잘못하고 있던 가정
그래서, 내가 같은 많은 다른 옵션을 시도 :
if (!main_image_)
main_image_ = boost::shared_ptr<IplImage> (cvCreateImage...
else
main_image_.reset(cvCreateImage...)
도 작동하지 않았다. 처음에 shared_ptr을 재설정하려고 시도했으나 작동하지 않았습니다. 새 임시 shared_ptr을 설정하고 내 main_image_ptr에 할당하려고했습니다. 성공하지 못했습니다.
여기서 제가 잘못 되었나요? 일반 포인터를 사용하고 수동으로 이미지를 공개하는 것은 매력처럼 일했습니다. 사전에
감사합니다,
'IplImage'와'cvCreateImage()'의 정의는 무엇입니까? –
이것은'shared_ptr' 문제와 관련이 없지만 각 프레임에 대해 640x480 이미지를 할당하는 것이 나에게 비효율적 인 것처럼 보입니다. 이미 할당 된 이미지를 재사용하는 것이 좋습니다. "이중 버퍼링"(http://en.wikipedia.org/wiki/Multiple_buffering#Double_buffering_in_computer_graphics)이라는 기술을 확인하십시오. –
@Maxim. IplImage는 OpenCV에서 사용되는 구조입니다. 이미지에 대한 데이터 및 메타 데이터를 보유합니다. cvCreateImage는 또한 OpenCV 형식이며 필요한 메모리를 할당합니다. @Emile : 물론 당신 말이 맞습니다. 동일한 이미지를 재사용하면 모든 것을 검정으로 칠하는 것이 좋습니다. 더블 버퍼링을 사용하지 않아도됩니다. 머리를 가져 주셔서 감사합니다. – Theo