Win32 API конвертирует ID3D11Texture2D в cv::MatC++

Программы на C++. Форум разработчиков
Anonymous
Win32 API конвертирует ID3D11Texture2D в cv::Mat

Сообщение Anonymous »

Итак, я пытаюсь преобразовать ID3D11Texture2D в OpenCV cv::Mat, но мой код по какой-то причине искажает изображение.

Код: Выделить всё

D3D11_TEXTURE2D_DESC capturedTextureDesc;
texture->GetDesc(&capturedTextureDesc);
capturedTextureDesc.Usage = D3D11_USAGE_STAGING;
capturedTextureDesc.BindFlags = 0;
capturedTextureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
capturedTextureDesc.MiscFlags = 0;

winrt::com_ptr userTexture = nullptr;
winrt::check_hresult(d3dDevice->CreateTexture2D(&capturedTextureDesc, NULL, userTexture.put()));
d3dContext->CopyResource(userTexture.get(), texture.get());
D3D11_MAPPED_SUBRESOURCE resource;
winrt::check_hresult(d3dContext->Map(userTexture.get(), NULL, D3D11_MAP_READ, 0, &resource));

//https://arxiv.org/pdf/1702.02514
int scWidth = capturedTextureDesc.Width;
int scHeight = capturedTextureDesc.Height;
int CAMERA_CHANNELS = 4;
unsigned char* buffer = new unsigned char[(scWidth * scHeight * CAMERA_CHANNELS)];
unsigned char* mappedData = reinterpret_cast(resource.pData);
memcpy(buffer, mappedData, (scWidth * scHeight * CAMERA_CHANNELS));
d3dContext->Unmap(userTexture.get(), 0);
IplImage* frame = cvCreateImageHeader(cvSize(scWidth, scHeight),
IPL_DEPTH_8U, CAMERA_CHANNELS);
frame->imageData = (char*)buffer;
cvSetData(frame, buffer, frame->widthStep);
// cv::Mat mt = cv::Mat(frame, true); // constructor dissapered
//https://stackoverflow.com/questions/15925084/conversion-from-iplimage-to-cvmat
cv::Mat mt = cv::cvarrToMat(frame);
return mt;
Вот окно, полученное с помощью вывода cv::Mat:
[img]https: //i.sstatic.net/oTBR0KmA.png[/img]

Они имеют одинаковый размер, но содержимое разное.

Подробнее здесь: https://stackoverflow.com/questions/786 ... d-to-cvmat

Вернуться в «C++»