From: Ian S. <ian...@st...> - 2005-05-03 07:35:57
|
Angel Todorov wrote: > Hi, > > I am loading an AVI clip with the following code: > > vidl_movie_sptr movie = vidl_io::load_movie (ivfn()); > > bool test_once=true; > > for (vidl_movie::frame_iterator pframe = movie->begin(); pframe < > movie->end(); ++pframe) > { > ... > if (test_once) > { > vil_image_view_base_sptr frame0 = pframe->get_view(); > vil_image_view<vxl_byte> frame (frame0); > > vil1_memory_image_of<vxl_byte> tmp = > vil1_from_vil_image_view(frame); > > test_once=false; > } > ... > > } > > Now, when the conversion takes place, I get the following "warning", and it > fails basically: > > WARNING vil1_vil1_from_image_view(): Unable to create > vil1_memory_image_of<T> > > By looking at vil1_vil.h , I can see the following: > > 00047 if (!vil_im.is_contiguous() || vil_im.nplanes() != 1) > 00048 { > 00049 vcl_cerr << "WARNING vil1_vil1_from_image_view(): Unable to create > vil1_memory_image_of<T>\n"; > 00050 return vil1_memory_image_of<T>(); > 00051 } > > So presumably , vil_im.is_contiguous() is not satisfied ? > > Btw, the avi loading and iterating through frames is not the cause of the > problem, since I have tried with other "vil_image_view"'s (obtained > differently) and got the same result. > > I am doing that on VS.NET 2003, winxp, VXL compiled with CMake for win32. I'm not sure if this is what you want to hear, but vil1 is largely deprecated. We really recommend not using vil1 for any new code. If you have some leagcy vil1 code, try using core/vil/scripts/vil1tovil.pl --- it won't do a full conversion, but it will find many of the correct function, class and method names, and comment bits that need further work. If you really do want to keep using vil1, then: 1. If you have an RGB image, then frame.nplanes()==3. If the image is acutal stored as RGB triples, then you can do a cheap conversion to an RGB image. vil_image_view<vil_rgb<vxl_byte> > frame_rgb = frame; assert(frame_rgb.nplanes()==1); 2. Non-contiguous images are ones with unpacked RGB quads, or extra bytes at the end of each raster. These extra bytes are put in by some libraries for alignment reasons. You can deep copy one of these images into a new packed image view as follows. vil_image_view<vxl_byte> packed_image(frame.ni(), frame.nj(), frame.nplanes()); vil_copy_reformat(frame, packed_frame); assert(frame_rgb.is_contiguous()); But really, leave vil1 behind. If there is some library code that only works with vil1, let us know, and we'll try and get someone to convert it - or better still convert it yourself, and we will commit the changes. Ian. |