From: C. V. <cri...@gm...> - 2008-06-30 20:00:21
|
Hi! I'm trying to convert a vidl2_frame to a vil_image_view, using the functions declared in <vidl2/vidl2_convert.h>. I'm using the function vidl2_convert_wrap_in_view, but its parameter must be of type const vidl2_frame&, and I have a vidl2_frame_sptr. I think it's a silly question, but how do I get the vidl2_frame object from an sptr? I'm not very familiar with smart pointers yet :( Thank you! -- Crístian Deives dos Santos Viana [aka CD1] Google Talk: cri...@gm... |
From: Matt L. <mat...@gm...> - 2008-06-30 20:25:50
|
Crístian, Smart pointers are designed to mimic the interface of standard C pointers as much as possible. So, just as with a C pointer, you can dereference with the * operator. // a frame smart pointer vidl2_frame_sptr frame = istream->current_frame(); // an image view vil_image_view<vxl_byte> view; // the conversion vidl2_convert_to_view(*frame,view); --Matt On Mon, Jun 30, 2008 at 4:00 PM, Crístian Viana <cri...@gm...> wrote: > Hi! > > I'm trying to convert a vidl2_frame to a vil_image_view, using the functions > declared in <vidl2/vidl2_convert.h>. I'm using the function > vidl2_convert_wrap_in_view, but its parameter must be of type const > vidl2_frame&, and I have a vidl2_frame_sptr. I think it's a silly question, > but how do I get the vidl2_frame object from an sptr? I'm not very familiar > with smart pointers yet :( > > Thank you! > > -- > Crístian Deives dos Santos Viana [aka CD1] > Google Talk: cri...@gm... > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://sourceforge.net/services/buy/index.php > _______________________________________________ > Vxl-users mailing list > Vxl...@li... > https://lists.sourceforge.net/lists/listinfo/vxl-users > > |
From: Peter V. <pet...@ya...> - 2008-06-30 20:33:49
|
> So, just as with a C pointer, you can dereference with the * operator. Or with the "->" operator: // a frame smart pointer vidl2_frame_sptr frame = istream->current_frame(); frame->method(); // where "method()" is any method on the vidl2_frame class, e.g. unsigned int ni = frame->ni(); void* data = frame->data(); // Or even directly from the function that returns the smart pointer: vod* data = istream->current_frame()->data(); -- Peter. ___________________________________________________ Sök efter kärleken! Hitta din tvillingsjäl på Yahoo! Dejting: http://ad.doubleclick.net/clk;185753627;24584539;x?http://se.meetic.yahoo.net/index.php?mtcmk=148783 |
From: Matt L. <mat...@gm...> - 2008-06-30 20:42:59
|
On Mon, Jun 30, 2008 at 4:33 PM, Peter Vanroose <pet...@ya...> wrote: > // Or even directly from the function that returns the smart pointer: > > vod* data = istream->current_frame()->data(); > I would avoid this last one. It will work fine as long as something else is sharing ownership of that pointer. However, if the smart pointer returned by a function has a reference count of 1 then the data will be delete as soon as you make that assignment (since the smart pointer goes out of scope). You end up with "data" pointing to deallocating memory. --Matt > > > > ___________________________________________________ > Sök efter kärleken! > Hitta din tvillingsjäl på Yahoo! Dejting: http://ad.doubleclick.net/clk;185753627;24584539;x?http://se.meetic.yahoo.net/index.php?mtcmk=148783 > > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://sourceforge.net/services/buy/index.php > _______________________________________________ > Vxl-users mailing list > Vxl...@li... > https://lists.sourceforge.net/lists/listinfo/vxl-users > |
From: Peter V. <pet...@ya...> - 2008-06-30 22:12:55
|
> > void* data = istream->current_frame()->data(); > > > > I would avoid this last one. > ... data will be deleted as soon as you make that assignment > (since the smart pointer goes out of scope). You end up with > "data" pointing to deallocating memory. Agreed. Thanks for pointing out. That's actually the difference between "normal" pointers and smart pointers! By assigning istream->current_frame() to a variable of datatype vidl2_frame_sptr, the counter will be incremented; when that variable goes out of scope, the count is decremented (and the data deleted if this was the last smart pointer referencing it). -- Peter. ___________________________________________________ Sök efter kärleken! Hitta din tvillingsjäl på Yahoo! Dejting: http://ad.doubleclick.net/clk;185753627;24584539;x?http://se.meetic.yahoo.net/index.php?mtcmk=148783 |
From: C. V. <cri...@gm...> - 2008-07-01 14:20:06
|
Thank you guys, now I can use the convert functions! And now I understand more about smart pointers :) But there's one last doubt: what's the difference between the functions vidl2_convert_to_view and vidl2_convert_wrap_in_view? I want to get a vil_image_view out of a vidl2_frame to convert it to another format (in Java), so which of those functions is better for me? On Mon, Jun 30, 2008 at 7:12 PM, Peter Vanroose <pet...@ya...> wrote: > > > void* data = istream->current_frame()->data(); > > > > > > > I would avoid this last one. > > ... data will be deleted as soon as you make that assignment > > (since the smart pointer goes out of scope). You end up with > > "data" pointing to deallocating memory. > > Agreed. Thanks for pointing out. > That's actually the difference between "normal" pointers and smart > pointers! > By assigning istream->current_frame() to a variable of datatype > vidl2_frame_sptr, the counter will be incremented; when that variable goes > out of scope, the count is decremented (and the data deleted if this was the > last smart pointer referencing it). > > -- Peter. > > > > > > > > ___________________________________________________ > Sök efter kärleken! > Hitta din tvillingsjäl på Yahoo! Dejting: > http://ad.doubleclick.net/clk;185753627;24584539;x?http://se.meetic.yahoo.net/index.php?mtcmk=148783 > -- Crístian Deives dos Santos Viana [aka CD1] Google Talk: cri...@gm... |
From: Matt L. <mat...@gm...> - 2008-07-01 14:42:36
|
Crístian, vidl2_convert_to_view always performs a deep copy of the image data (it may also perform some conversion if the frame encoding is not supported by vil). This means it is safe and should always work. The resulting vil_image_view will "own" its image data. vidl2_convert_wrap_in_view tries to perform a shallow copy. That is, it tries to construct a vil_image_view that is a wrapper around the same memory used by the vidl2_frame. This will always be faster than vidl2_convert_to_view, but may not always work. If the frame encoding is not supported by vil it will return a null smart pointer. Also, it is generally not safe to use the resulting vil image after the original vidl2_frame is destroyed. In some cases, like when the vidl2_frame is created from a vil_image_view and then the frame is converted back to a vil_image_view, the memory is shared (with a smart pointer) and it is safe to delete the original structures. In short, you should use vidl2_convert_to_view unless you are looking for speed and know what you are doing. --Matt On Tue, Jul 1, 2008 at 10:20 AM, Crístian Viana <cri...@gm...> wrote: > Thank you guys, now I can use the convert functions! And now I understand > more about smart pointers :) > > But there's one last doubt: what's the difference between the functions > vidl2_convert_to_view and vidl2_convert_wrap_in_view? I want to get a > vil_image_view out of a vidl2_frame to convert it to another format (in > Java), so which of those functions is better for me? > > On Mon, Jun 30, 2008 at 7:12 PM, Peter Vanroose <pet...@ya...> > wrote: >> >> > > void* data = istream->current_frame()->data(); >> > > >> > >> > I would avoid this last one. >> > ... data will be deleted as soon as you make that assignment >> > (since the smart pointer goes out of scope). You end up with >> > "data" pointing to deallocating memory. >> >> Agreed. Thanks for pointing out. >> That's actually the difference between "normal" pointers and smart >> pointers! >> By assigning istream->current_frame() to a variable of datatype >> vidl2_frame_sptr, the counter will be incremented; when that variable goes >> out of scope, the count is decremented (and the data deleted if this was the >> last smart pointer referencing it). >> >> -- Peter. >> >> >> >> >> >> >> >> ___________________________________________________ >> Sök efter kärleken! >> Hitta din tvillingsjäl på Yahoo! Dejting: >> http://ad.doubleclick.net/clk;185753627;24584539;x?http://se.meetic.yahoo.net/index.php?mtcmk=148783 > > > > -- > Crístian Deives dos Santos Viana [aka CD1] > Google Talk: cri...@gm... |
From: C. V. <cri...@gm...> - 2008-07-01 14:50:26
|
Then I think the function vidl2_convert_wrap_in_view is more suitable for me. I'll give it a try. Thanks! On Tue, Jul 1, 2008 at 11:42 AM, Matt Leotta <mat...@gm...> wrote: > Crístian, > > vidl2_convert_to_view always performs a deep copy of the image data > (it may also perform some conversion if the frame encoding is not > supported by vil). This means it is safe and should always work. The > resulting vil_image_view will "own" its image data. > > vidl2_convert_wrap_in_view tries to perform a shallow copy. That is, > it tries to construct a vil_image_view that is a wrapper around the > same memory used by the vidl2_frame. This will always be faster than > vidl2_convert_to_view, but may not always work. If the frame encoding > is not supported by vil it will return a null smart pointer. Also, it > is generally not safe to use the resulting vil image after the > original vidl2_frame is destroyed. In some cases, like when the > vidl2_frame is created from a vil_image_view and then the frame is > converted back to a vil_image_view, the memory is shared (with a smart > pointer) and it is safe to delete the original structures. > > In short, you should use vidl2_convert_to_view unless you are looking > for speed and know what you are doing. > > --Matt > > On Tue, Jul 1, 2008 at 10:20 AM, Crístian Viana > <cri...@gm...> wrote: > > Thank you guys, now I can use the convert functions! And now I understand > > more about smart pointers :) > > > > But there's one last doubt: what's the difference between the functions > > vidl2_convert_to_view and vidl2_convert_wrap_in_view? I want to get a > > vil_image_view out of a vidl2_frame to convert it to another format (in > > Java), so which of those functions is better for me? > > > > On Mon, Jun 30, 2008 at 7:12 PM, Peter Vanroose < > pet...@ya...> > > wrote: > >> > >> > > void* data = istream->current_frame()->data(); > >> > > > >> > > >> > I would avoid this last one. > >> > ... data will be deleted as soon as you make that assignment > >> > (since the smart pointer goes out of scope). You end up with > >> > "data" pointing to deallocating memory. > >> > >> Agreed. Thanks for pointing out. > >> That's actually the difference between "normal" pointers and smart > >> pointers! > >> By assigning istream->current_frame() to a variable of datatype > >> vidl2_frame_sptr, the counter will be incremented; when that variable > goes > >> out of scope, the count is decremented (and the data deleted if this was > the > >> last smart pointer referencing it). > >> > >> -- Peter. > >> > >> > >> > >> > >> > >> > >> > >> ___________________________________________________ > >> Sök efter kärleken! > >> Hitta din tvillingsjäl på Yahoo! Dejting: > >> > http://ad.doubleclick.net/clk;185753627;24584539;x?http://se.meetic.yahoo.net/index.php?mtcmk=148783 > > > > > > > > -- > > Crístian Deives dos Santos Viana [aka CD1] > > Google Talk: cri...@gm... > -- Crístian Deives dos Santos Viana [aka CD1] Google Talk: cri...@gm... |