Commit 55417e1e8b561618ec296f38d3233c7f14fefb5c

Authored by David Mayerich
1 parent 035d968f

fixed data type loading error in stim::image

matlab/stimImageStack.m renamed to matlab/stim_images2matrix.m
1   -function S = stimImageStack(filemask)
  1 +function S = stim_images2matrix(filemask)
  2 +%This function loads a set of images as a 3D matrix. Color images are
  3 +%converted to grayscale when loaded, so the resulting matrix is always 3D
  4 +%with size X x Y x Z, where:
  5 +% X is the size of the images along the X axis
  6 +% Y is the size of the images along the Y axis
  7 +% Z is the number of images
  8 +%
  9 +% all images are assumed to be the same size (though they do not have to
  10 +% be the same file format or number of bits per pixel
  11 +
2 12 files = dir(filemask);
3 13  
4 14 %figure out the file size
... ...
stim/image/image.h
... ... @@ -53,6 +53,10 @@ class image{
53 53 void allocate(){
54 54 unalloc();
55 55 img = (T*) malloc( sizeof(T) * R[0] * R[1] * R[2] ); //allocate memory
  56 + if (img == NULL) {
  57 + std::cout << "stim::image ERROR - failed to allocate memory for image" << std::endl;
  58 + exit(1);
  59 + }
56 60 }
57 61  
58 62 void allocate(size_t x, size_t y, size_t c){ //allocate memory based on the resolution
... ... @@ -228,6 +232,14 @@ public:
228 232 }
229 233 }
230 234 #endif
  235 + //Copy N data points from source to dest, casting while doing so
  236 + template<typename S, typename D>
  237 + void type_copy(S* source, D* dest, size_t N) {
  238 + if (typeid(S) == typeid(D)) //if both types are the same
  239 + memcpy(dest, source, N * sizeof(S)); //just use a memcpy
  240 + for (size_t n = 0; n < N; n++) //otherwise, iterate through each element
  241 + dest[n] = (D)source[n]; //copy and cast
  242 + }
231 243 /// Load an image from a file
232 244 void load(std::string filename){
233 245 #ifdef USING_OPENCV
... ... @@ -236,13 +248,15 @@ public:
236 248 std::cout<<"ERROR stim::image::load() - unable to find image "<<filename<<std::endl;
237 249 exit(1);
238 250 }
  251 + int cv_type = cvImage.type();
239 252 int cols = cvImage.cols;
240 253 int rows = cvImage.rows;
241 254 int channels = cvImage.channels();
242 255 allocate(cols, rows, channels); //allocate space for the image
  256 + size_t img_bytes = bytes();
243 257 unsigned char* cv_ptr = (unsigned char*)cvImage.data;
244   - if(C() == 1) //if this is a single-color image, just copy the data
245   - memcpy(img, cv_ptr, bytes());
  258 + if (C() == 1) //if this is a single-color image, just copy the data
  259 + type_copy<unsigned char, T>(cv_ptr, img, size());
246 260 if(C() == 3) //if this is a 3-color image, OpenCV uses BGR interleaving
247 261 from_opencv(cv_ptr, X(), Y());
248 262 #else
... ...