Проблема распаковки и отображения Canon EDSDK в режиме реального времени - PullRequest
0 голосов
/ 08 марта 2019

Привет. Я пытаюсь отобразить изображение в реальном времени с камеры canon, используя EDSDK.Мне удалось заставить его работать, но я получаю странные артефакты.Это черный и серый, слишком маленький, и изображение ... double?.

Информация о разрешении, которую я получаю, составляет 1056 x 704 от tjDecompressHeader3 () и EdsImageInfo() .Но большая часть изображения с камеры в режиме реального времени не отображается на компьютере, как, например, за ее пределами.Вот как это выглядит: https://imgur.com/a/1DW6ThO

Что может быть причиной этого?В небольшой буфер?Неправильное разрешение?Я заблудился.

Здесь я снимаю редактор кода на своем экране: https://i.gyazo.com/27dc0503ee23734ce571928f3a179d77.mp4

Редактировать: Итак, я попытался изменить TJPF_RGB на TJPF_GRAY в функции tjDecompress, и это работает, но хорошокроме его черного и белого.(Я испробовал все форматы пикселей).

Это соответствующий код для этого проекта.(Это первый код на C ++, который я когда-либо написал, поэтому извините).

LVERROR LiveView::decompress(unsigned long strLen, unsigned char* strPtr, unsigned char** decompressed)
{
    LVERROR d_err = LV_ERR_OK;
    char* d_err_str = NULL;

    unsigned char* dstBuf = NULL;
    unsigned long buffSize;
    int width, height, jpegSubsamp, jpegColorspace;


    tjhandle _jpegDecompressorHandle = tjInitDecompress();

    if (_jpegDecompressorHandle == NULL)
    {
        d_err_str = tjGetErrorStr();
        d_err = LV_ERR_CREATING_DECOMPRESSION_HANDLE;
    }

    if (d_err == LV_ERR_OK)
    {
        d_err = tjDecompressHeader3(
            _jpegDecompressorHandle,
            strPtr,
            strLen,
            &width,
            &height,
            &jpegSubsamp,
            &jpegColorspace); 

        if (d_err != LV_ERR_OK)
        {
            d_err_str = tjGetErrorStr();
            d_err = LV_ERR_DECOMPRESS_HEADER;
        }
        std::cout << width << " x " << height << std::endl; // 1056 x 704
    }

    if (d_err == LV_ERR_OK)
    {
        buffSize = tjBufSize(width, height, jpegSubsamp);
        if (buffSize < 0)
        {
            d_err_str = tjGetErrorStr();
            d_err = LV_ERR_BUFSIZE_OUT_OF_BOUNDS;
        }
    }

    if (d_err == LV_ERR_OK)
    {
        dstBuf = tjAlloc(buffSize);

        d_err = tjDecompress2(
            _jpegDecompressorHandle,
            strPtr,
            strLen,
            dstBuf,
            width,
            0,
            height,
            TJPF_RGB,
            TJFLAG_FASTDCT);

        if (d_err != LV_ERR_OK)
        {
            d_err_str = tjGetErrorStr();
            d_err = LV_ERR_DECOMPRESS2;
        }
    }

    if (d_err == LV_ERR_OK)
        *decompressed = *&dstBuf;
    else
        std::cout << "err: " << d_err_str << std::endl;

    return d_err;   
}

//... ...

void LiveView::displayImage(cv::Mat image)
{
    cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
    cv::imshow(windowName, image);  
}

//... ...

cv::Mat LiveView::createImageMat(int height, int width, unsigned char* buffer)
{
    cv::Mat image = cv::Mat(height, width, CV_8UC1, buffer);
    return image;
}

//... ...

void LiveView::liveLoop(Canon canon)
{
    LVERROR  lv_err  = LV_ERR_OK;
    EdsError eds_err = EDS_ERR_OK;

    unsigned char* decompressed = NULL;
    EdsImageInfo imageInfo;

    while (true)
    {
        eds_err = canon.downloadImageData();

        if (eds_err != EDS_ERR_OK)
            throw eds_err;

        if (canon.gotNewFrame())
        {
            canon.getImageInfo(canon.getStreamRef(), imageInfo);

            lv_err = decompress(canon.getStreamLength(), (unsigned char*)canon.getStreamPointer(), &decompressed);
            if (lv_err != LV_ERR_OK)
                throw(lv_err);

            std::cout << imageInfo.width << " x " << imageInfo.height << std::endl; // 1056 x 704

            cv::Mat image = createImageMat(imageInfo.height, imageInfo.width, decompressed);
            displayImage(image);
            tick();

            tjFree(decompressed);
        }
    }
}

...