Nano Hash - криптовалюты, майнинг, программирование

Внутренняя ошибка Canon SDK в edsDownload

У меня есть внутренняя ошибка в EdsDownload. Я использую EOS 1100D без SD-карты. Образец кода Canon (CameraContorol) может загрузить изображение. Используемый SDK: 2.13 и 2.12 (у меня такая же проблема с обоими). Пожалуйста, помогите мне.
Примечание: после запуска размер "picture000x.jpg" равен 0 (из-за вызова EdsCreateFileStream).

Вывод моего кода:
Имя устройства: Canon EOS 1100D.
ПОЛУЧИТЬ ИЗОБРАЖЕНИЕ:
'Вызов' handleObjectEvent.
Событие: kEdsStateEvent_JobStatusChanged,
Код события: 770< br>
Внутренняя ошибка в EdsDownload.
поток != NULL
Загрузка завершена.
Нажмите клавишу для выхода.

Мой код:

bool getPictureEnabled = false,
     hasCamera = false;
EdsCameraRef camera;
EdsImageRef picture;
volatile EdsUInt32 bufferSize;

EdsError DownloadImage(EdsDirectoryItemRef directoryItem);

handleSateEvent:

EdsError EDSCALLBACK handleSateEvent(EdsStateEvent event, EdsUInt32 parameter, EdsVoid * context) {
    switch(event) {
    case kEdsStateEvent_CaptureError:
        printf("Event: kEdsStateEvent_CaptureError,\n");
        throw "Camera capture error.";

    case kEdsStateEvent_JobStatusChanged:
        printf("Event: kEdsStateEvent_JobStatusChanged,\n");
        break;

    default:
        break;
    }

    printf("Event code: %d.\n", (int)event);

    return EDS_ERR_OK;
}

обрабатыватьОбъектЕвент:

EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid * context) {
    if(event == kEdsObjectEvent_DirItemCreated || event == kEdsObjectEvent_DirItemRequestTransfer || event == kEdsObjectEvent_DirItemRequestTransferDT) {
        if(!getPictureEnabled)  {
            printf("object event handler: FALSE alert\n");
            if(object) EdsRelease(object);
            return EDS_ERR_OK;
        }
        //EdsRetain(object);
        DownloadImage(object);
    }

    if(object) EdsRelease(object);

    return EDS_ERR_OK;
}

основная функция:

int main(int parC, char *pars[]) {
    int processCounter = 0;
    EdsCameraListRef eclr;
    EdsError edsError = EdsInitializeSDK();
    if(edsError)  {
        printf("I can't initialize the Eds sdk.\n");
        goto stop;
    }

    processCounter = 1;
    edsError = EdsGetCameraList(&eclr);
    if(edsError)  {
        printf("I can't get the camera list.\n");
        goto stop;
    }

    processCounter = 2;
    EdsUInt32 camCount;
    edsError = EdsGetChildCount(eclr, &camCount);
    if(edsError)  {
        printf("I can't read the camera count.\n");
        goto stop;
    }

    hasCamera = camCount > 0;
    if(!hasCamera)  {
        printf("There is no camera in the list.\n");
        goto stop;
    }

    edsError = EdsGetChildAtIndex(eclr, 0, &camera);
    if(edsError)  {
        printf("I can't get the camera.\n");
        goto stop;
    }

    edsError = EdsSetCameraStateEventHandler(camera, kEdsStateEvent_All, handleSateEvent, NULL);
    if(edsError) printf("Error at EdsSetCameraStateEventHandler.\n");

    edsError = EdsSetObjectEventHandler(camera, kEdsObjectEvent_All, handleObjectEvent, NULL);
    if(edsError)  {
        printf("Error at EdsSetObjectEventHandler.\n");
        goto stop;
    }

    edsError = EdsOpenSession(camera);
    if(edsError)  {
        printf("I can't open the session.\n");
        goto stop;
    }

    processCounter = 3;

    EdsDeviceInfo outDeviceInfo;
    edsError = EdsGetDeviceInfo(camera, &outDeviceInfo);
    if(edsError) printf("I can't get device info.\n");
    else printf("Device name: %s.\n", (char *) outDeviceInfo.szDeviceDescription);

    EdsUInt32 saveTo = kEdsSaveTo_Host;
    edsError = EdsSetPropertyData(camera, kEdsPropID_SaveTo, 0, sizeof(EdsUInt32) , &saveTo);
    if(edsError != EDS_ERR_OK) printf("Error at EdsSetPropertyData -> kEdsSaveTo.\n");

    EdsCapacity capacity = {0x7FFFFFFF, 0x1000, 1};
    edsError = EdsSetCapacity(camera, capacity);
    if(edsError != EDS_ERR_OK) printf("Error at EdsSetPropertyData -> kEdsSaveTo.\n");

    printf("GET PICTURE:\n");
    getPictureEnabled = true;
    edsError = EdsSendCommand(camera, kEdsCameraCommand_TakePicture , 0);

    if(edsError) printf("ERROR: Take picture.\n");
    else { //handleObjectEvent "call":
        printf("'Call' handleObjectEvent.\n");
        edsError = EdsCloseSession(camera);
        if(edsError) printf("I can't close the session 1.\n");

        edsError = EdsOpenSession(camera);
        if(edsError) printf("I can't open the session 2.\n");
    }

stop:
    printf("Press key to quit...\n");
    getchar();

    switch (processCounter) {

    case 3:
        edsError = EdsCloseSession(camera);
        if(edsError) printf("I can't close the session 2.\n");

    case 2:
        edsError = EdsRelease(eclr);
        if(edsError) printf("I can't release eds cam. list.\n");

    case 1:
        EdsTerminateSDK();

    default: break;
    }

    return 0;
}

Функция загрузки изображения:

EdsError DownloadImage(EdsDirectoryItemRef directoryItem) {
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED ); //i tried without this, and don't screen change

    EdsError err;
    EdsStreamRef stream = NULL;

    EdsDirectoryItemInfo dirItemInfo;
    err = EdsGetDirectoryItemInfo(directoryItem, &dirItemInfo);

    if(err == EDS_ERR_OK) {
        err = EdsCreateFileStream(dirItemInfo.szFileName, kEdsFileCreateDisposition_CreateAlways, kEdsAccess_ReadWrite, &stream);
        if(err != EDS_ERR_OK) printf("ERROR: EdsCreateFileStream.\n");
        bufferSize = dirItemInfo.size; 
        //EdsSetProgressCallback(stream, ProgressFunc, kEdsProgressOption_Periodically, NULL);
    }
    else printf("ERROR 1\n");

    //err = EdsSendStatusCommand(camera, kEdsCameraStatusCommand_UILock, 0); //i tried with this, and don't screen change
    //err = EdsSendStatusCommand(camera, kEdsCameraStatusCommand_EnterDirectTransfer, 0); //i tried with this, and don't screen change
    if(err) {
        printf("ERROR: transfer lock.\n");
    }//*/

    //if(err == EDS_ERR_OK)
    //do
    //{
        err = EdsDownload(directoryItem, dirItemInfo.size, stream); //HERE IS THE PROBLEM: EDS_ERR_INTERNAL_ERROR! (after that row: err = 2)
    //}
    //while(err != EDS_ERR_OK);//*/
    if(err == EDS_ERR_INTERNAL_ERROR) printf("\n\t\tInternal error at EdsDownload.\n");

    //if(err == EDS_ERR_OK)
    {
        err = EdsDownloadComplete(directoryItem);
    }

    // Release stream
    if( stream != NULL) {
        EdsCreateImageRef(stream, &picture);
        EdsRelease(stream);
        stream = NULL;
        printf(" stream != NULL\n");
    }

    //err = EdsSendStatusCommand(camera, kEdsCameraStatusCommand_ExitDirectTransfer, 0); //i tried with this, and don't screen change
    //err = EdsSendStatusCommand(camera, kEdsCameraStatusCommand_UIUnLock, 0); //i tried with this, and don't screen change
    if(err) {
        printf("ERROR: transfer lock.\n");
        return NULL;
    }//*/
    printf("Download ended.\n");

    CoUninitialize(); //i tried without this, and don't screen change
    return err;
}
24.05.2013

  • У вас получился довольно здоровенный блок кода! Возможно, вы захотите сжать его, чтобы просто показать функцию DownloadImage, чтобы выделить строки в конце, которые вызывают ошибку, может быть сложно проанализировать, хотя много кода просто для того, чтобы добраться до сути проблемы. 24.05.2013
  • У вас есть само исключение/ошибка? 24.05.2013
  • Никаких исключений и ошибок нет, только внутренняя ошибка в edsDownload и событие JobStatusChanged. 25.05.2013
  • Я знаю, что код большой, но ранее я искал решение проблемы в Google, и там было много решений, но эти (основные: kEdsSaveTo_Host, EdsSetCapacity, EdsSetObjectEventHandler, ...) есть в моем коде. Есть четыре функции. 2 обработчика событий (handleSateEvent и handleObjectEvent), основной код (с вызовами инициализации/выпуска sdk и камеры) и, наконец, код DownloadImage. Я пытаюсь выделить что-то, но в коде: это не работает. (Это мой первый вопрос, но я ищу возможности.) 25.05.2013
  • Я думаю, что основной код важен. Раньше у меня была проблема: без блока '//handleObjectEvent call:' (в основном) handleObjectEvent не вызывался или вызывался сразу после добавления события EdsSetObjectEventHandler. 25.05.2013
  • Я разделил функции. 25.05.2013
  • Я надеюсь, что если код будет работать: весь код будет полезен другим. 25.05.2013

Ответы:


1

Всем спасибо!
У меня есть решение. Этого нет в документе SDK. Вот и здесь. Эта проблема существует, если вы используете операционную систему Windows.
Конкретное решение:

    while(GetMessage(&msg, NULL, NULL, NULL))
    {        
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }

Я поправлю код, удалю лишние комментарии и он будет работать у всех! (Скоро.)

30.05.2013

2

Не могли бы вы проверить вызов «EdsCreateFileStream», особенно первый параметр? Согласно документам, «он создает новый файл на хост-компьютере (или открывает существующий файл) и создает файловый поток для доступа к файлу». Первым параметром должен быть локальный, доступный путь к файлу (например, «C:\tmp.jpg» в Windows), и, если быстро просмотреть его, может оказаться, что вы указали его неправильно. Не могли бы вы напечатать это?

28.05.2013
  • Спасибо за ваш ответ. Первый параметр иногда бывает IMG_0001.JPG (иногда: IMG_0002.JPG.. и т.д.). Он создается рядом с файлами cpp и заголовков (если он работает в среде VS). Если я удалю файл и снова запущу программу: ошибка та же самая, и снова сгенерирую файл с нулевой длиной. kEdsFileCreateDisposition_CreateAlways — создает новый файл. Если указанный файл уже существует, этот файл перезаписывается, а существующие атрибуты стираются. (doc) ‹br› Возможно, атрибуту чтения и записи не повезло, но я пробовал с kEdsAccess_Write, и никаких изменений. 28.05.2013
  • хорошо, это звучит нормально. Не могли бы вы попробовать использовать EdsCreateMemoryStream вместо EdsCreateFileStream? Чтобы быть уверенным, не могли бы вы убедиться, что saveTo имеет тип EdsSaveTo, а также использовать sizeof(EdsSaveTo). Если это также не работает, всегда есть вероятность проблем с вашей средой сборки (связывание с правильными DLL). Я не могу помочь здесь, потому что я использую osX, а не Windows. 29.05.2013
  • Я попробовал EdsCreateMemoryStream, но внутренняя ошибка осталась. saveTo — это тип EdsUInt32, и документ тоже имеет этот тип. Тип размера - EdsUInt32, а не int. Я исправляю это, но есть та же проблема. Я смотрю идею dll. Спасибо за ваше время! 30.05.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..