Привет. Я пытаюсь отобразить изображение в реальном времени с камеры 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);
}
}
}