EdsError Camera::requestDownloadEvfData( QImage& img ) { if( !mIsLiveView ){ std::cerr << "No live view" << std::endl; startLiveView(); return EDS_ERR_OK; } EdsError err = EDS_ERR_OK; EdsStreamRef stream = NULL; EdsEvfImageRef evfImage = NULL; // Create memory stream. err = EdsCreateMemoryStream(0, &stream); // Create EvfImageRef. if(err == EDS_ERR_OK) { //std::cout << " memoryOK" << std::endl; err = EdsCreateEvfImageRef(stream, &evfImage); } // Download live view image data. if(err == EDS_ERR_OK){ //std::cout << " dataOK" << std::endl; err = EdsDownloadEvfImage(mCamera, evfImage); } // Display image EdsUInt32 length; unsigned char* image_data; EdsGetLength( stream, &length ); if( length <= 0 ) return EDS_ERR_OK; EdsGetPointer( stream, (EdsVoid**)&image_data ); //std::cout << "length:" << length << " " << sizeof(image_data) << std::endl; // reserve memory img = QImage::fromData(image_data, length, "JPG"); // Buffer buffer( image_data, length ); // surface = Surface( loadImage( DataSourceBuffer::create(buffer), ImageSource::Options(), "jpg" ) ); // Release stream if(stream != NULL) { EdsRelease(stream); stream = NULL; } // Release evfImage if(evfImage != NULL) { EdsRelease(evfImage); evfImage = NULL; } return EDS_ERR_OK; }
//--------------------------------------------------------------------- bool CanonCameraWrapper::saveImageFromLiveView(string saveName){ EdsError err = EDS_ERR_OK; EdsEvfImageRef evfImage = NULL; EdsStreamRef stream = NULL; if( evfMode == 0 ){ printf("Live view needs to be enabled first\n"); return false; } //save the file stream to disk err = EdsCreateFileStream( ( ofToDataPath(saveName) ).c_str(), kEdsFileCreateDisposition_CreateAlways, kEdsAccess_ReadWrite, &stream); // Create EvfImageRef. if (err == EDS_ERR_OK){ err = EdsCreateEvfImageRef(stream, &evfImage); } // Download live view image data. if (err == EDS_ERR_OK){ err = EdsDownloadEvfImage(theCamera, evfImage); } if (err == EDS_ERR_OK){ printf("Got live view frame %i \n", liveViewCurrentFrame); liveViewCurrentFrame++; } easyRelease(stream); easyRelease(evfImage); //Notification of error if(err != EDS_ERR_OK){ if(err == EDS_ERR_OBJECT_NOTREADY){ printf("saveImageFromLiveView - not ready\n"); }else if(err == EDS_ERR_DEVICE_BUSY){ printf("saveImageFromLiveView - device is busy\n"); } else{ printf("saveImageFromLiveView - some other error\n"); } return false; } return true; }
void CanonCamera::UpdateView() { if(!liveView) return; EdsError err = EDS_ERR_OK; EdsStreamRef stream = NULL; EdsEvfImageRef evfImage = NULL; // Create memory stream. err = EdsCreateMemoryStream(0, &stream); if(err != EDS_ERR_OK) { printf("Error in EdsCreateMemoryStream: 0x%X\n", err); } err = EdsCreateEvfImageRef(stream, &evfImage); if(err != EDS_ERR_OK) { printf("Error in EdsCreateEvfImageRef: 0x%X\n", err); } bool wait = true; int numTries = 0; while(wait && numTries++ < 20) { err = EdsDownloadEvfImage(camera, evfImage); if(err != EDS_ERR_OK && err != EDS_ERR_OBJECT_NOTREADY) { printf("Error in EdsDownloadEvfImage: 0x%X\n", err); } if(err == EDS_ERR_OBJECT_NOTREADY) { Sleep(250); } else { wait = false; } } if(numTries > 20) { printf("ERROR: camera is taking too long for EdsDownloadEvfImage\n"); } unsigned char* pByteImage = NULL; // Get image (JPEG) pointer. err = EdsGetPointer(stream, (EdsVoid**)&pByteImage ); if(err != EDS_ERR_OK) { printf("Error in EdsGetPointer Histogram: 0x%X\n", err); } EdsUInt32 size; err = EdsGetLength(stream, &size); if(err != EDS_ERR_OK) { printf("Error in EdsGetLength Histogram: 0x%X\n", err); } EdsImageRef image = NULL; EdsImageInfo imageInfo; err = EdsCreateImageRef(stream, &image); if(err != EDS_ERR_OK) { printf("Error in EdsCreateImageRef: 0x%X\n", err); } err = EdsGetImageInfo(image, kEdsImageSrc_FullView, &imageInfo); if(err != EDS_ERR_OK) { printf("Error in EdsGetImageInfo: 0x%X\n", err); } if(imageInfo.componentDepth != 8) { printf("Error imageInfo.componentDepth != 8\n"); } liveImage = cvCreateImage(cvSize(imageInfo.width, imageInfo.height), IPL_DEPTH_8U, imageInfo.numOfComponents); EdsUInt32 DataSize = 0; CImage cImage; HRESULT hr; CComPtr<IStream> iStream = NULL; HGLOBAL hMem = GlobalAlloc(GHND, size); LPVOID pBuff = GlobalLock(hMem); memcpy(pBuff, pByteImage, size); GlobalUnlock(hMem); hr = CreateStreamOnHGlobal(hMem, TRUE, &iStream); // Get the bitmap image from the stream if ((hr = cImage.Load(iStream)) == S_OK) { int pitch = cImage.GetPitch(); int height = cImage.GetHeight(); BYTE* pBits = (BYTE*)cImage.GetBits(); if (pitch < 0) pBits += (pitch *(height -1)); memcpy(liveImage->imageData, pBits, abs(pitch) * height); } cImage.~CImage(); GlobalFree(hMem); cvFlip(liveImage, NULL, 0); // Release stream if(stream != NULL) { err = EdsRelease(stream); if(err != EDS_ERR_OK) { printf("Error in EdsRelease: 0x%X\n", err); } stream = NULL; } if(evfImage != NULL) { err = EdsRelease(evfImage); if(err != EDS_ERR_OK) { printf("Error in EdsRelease: 0x%X\n", err); } evfImage = NULL; } EdsRelease(image); cvShowImage(windowName.c_str(), liveImage); cvReleaseImage(&liveImage); }
//--------------------------------------------------------------------- bool CanonCameraWrapper::grabPixelsFromLiveView(int rotateByNTimes90){ EdsError err = EDS_ERR_OK; EdsEvfImageRef evfImage = NULL; EdsStreamRef stream = NULL; EdsUInt32 bufferSize = 2 * 1024 * 1024; bool success = false; if( evfMode == 0 ){ printf("grabPixelsFromLiveView - live view needs to be enabled first\n"); return false; } // Create memory stream. err = EdsCreateMemoryStream(bufferSize, &stream); // Create EvfImageRef. if (err == EDS_ERR_OK){ err = EdsCreateEvfImageRef(stream, &evfImage); } // Download live view image data. if (err == EDS_ERR_OK){ err = EdsDownloadEvfImage(theCamera, evfImage); } if (err == EDS_ERR_OK){ // printf("Got live view frame %i \n", liveViewCurrentFrame); liveViewCurrentFrame++; EdsUInt32 length; EdsGetLength(stream, &length); if( length > 0 ){ unsigned char * ImageData; EdsUInt32 DataSize = length; EdsGetPointer(stream,(EdsVoid**)&ImageData); EdsGetLength(stream, &DataSize); memoryImage convertor; if( convertor.loadFromMemory((int)DataSize, ImageData, rotateByNTimes90) ){ int imageWidth = convertor.width; int imageHeight = convertor.height; if( imageWidth > 0 && imageHeight > 0 ){ if( livePixels == NULL || ( livePixelsWidth != imageWidth || livePixelsHeight != imageHeight ) ){ if( livePixels != NULL )delete[] livePixels; livePixels = new unsigned char[imageWidth * imageHeight * 3]; livePixelsWidth = imageWidth; livePixelsHeight = imageHeight; } unsigned char * pix = convertor.getPixels(); int numToCopy = imageWidth * imageHeight * 3; for(int i = 0; i < numToCopy; i++){ livePixels[i] = pix[i]; } //printf("Live view frame converted to pixels\n"); success = true; }else{ printf("unable to convert the memory stream! width and height 0 \n"); } }else{ printf("Unable to load from memory\n"); } } } easyRelease(stream); easyRelease(evfImage); //Notification of error if(err != EDS_ERR_OK){ if(err == EDS_ERR_OBJECT_NOTREADY){ printf("saveImageFromLiveView - not ready\n"); }else if(err == EDS_ERR_DEVICE_BUSY){ printf("saveImageFromLiveView - device is busy\n"); } else{ //printf("saveImageFromLiveView - some other error\n"); } return false; } return success; }