نسخ كائن مدبب مع OpenCV

أنا لست كثيرًا من مبرمج C ++ ، حيث أني معتاد على C# و Java حيث لا يحتاج المرء إلى القلق بشأن المؤشرات. اعتقدت أني فهمت ما كنت أفعله هنا ، لكن النتائج ليست ما كنت أتوقعه ، وأنا لست متأكدة من أنني أفعل شيئًا سخيفًا هنا ، أو في مكان آخر في البرنامج يسبب المشاكل.

على أي حال ، أنا أعمل مع OpenCV ، ولدي صورتان ، أقوم بتدوينها على هذا النحو:

IplImage *current_frame = NULL;
IplImage *previous_frame = NULL;

ثم لدي كتلة الرمز هذه:

if (current_frame != NULL)
    {
        previous_frame = new IplImage(*current_frame);
        current_frame = cvQueryFrame( capture );
    }
    else
    {
        current_frame = cvQueryFrame( capture );
        previous_frame = cvQueryFrame( capture );
    }

الفكرة هي أنه في المرة الأولى التي يتم فيها تنفيذ الكود ، سيستخدم كل من الإطارات الحالية والسابقة الصورة الملتقطة حديثًا ، ولكن في الأطر التالية ، ستأخذ previous_frame القيمة السابقة لـ current_frame ، وسيقوم current_frame بالتقاط صورة جديدة (لقد تقدمت عبر رمز وذهب إلى الفروع الصحيحة من بيان if).

ما يحدث في الواقع هو أنني إخراج كلاً من الإطارات وأنها متطابقة ، بدلاً من السابق -frame متخلفة واحدة كما أريد.

هل أسيء استخدام المؤشرات؟ إذا كان الأمر كذلك ، كيف يجب أن أذهب للحصول على السلوك الذي أريده؟ أو هل يبدو أن الأمر يجب أن يفعل ما أريده؟

شكر.

2

1 إجابة

I suspect you are using the raw C API: here IplImage is defined as a POD struct

typedef struct _IplImage
{
 //...
    char *imageData;
 //...
}
IplImage;

كما ترون ، الجديد IplImage (* current_frame) ينسخ فقط المؤشرات (خاصة ، imageData </​​code>) ، وليس البيانات الفعلية. لذا فأنت تشترك في البيانات في كلتا الصورتين.

I suggest you read here for the C++ wrappers, and especially how to use them for memory management: http://opencv.willowgarage.com/documentation/cpp/memory_management.html

EDIT If you want to use the C API:

currFrame = cvQueryFrame( cap );

// Clone the frame to have an identically sized and typed copy
prevFrame  = cvCloneImage( currFrame );
1
وأضاف
تعثر على طريقة C API للقيام بذلك من هذا السؤال مماثل: stackoverflow.com/questions/4567188/&hellip؛
وأضاف المؤلف sehe, مصدر
هذا cvCloneImage يفعل بالضبط ما كنت أحاول القيام به ، وذلك بفضل! كما أنني أرى الآن لماذا كان ما أفعله سخيفًا ، لذلك أشكرك أيضًا على ذلك!
وأضاف المؤلف Diarmuid Ó Muirgheasa, مصدر