【发布时间】:2021-04-13 10:28:15
【问题描述】:
我正在使用 NDK CAMERA2 API 流式传输相机帧。我的 AIMAGE_READER 的格式是 YUV420;但是我想将其转换为 RGB。我查找了一些执行相同操作的 Java 示例,但由于某种原因,它无法正常工作并且图像失真。
帧分辨率为 640X480。
谁能告诉我我做错了什么
void NativeCamera::previewImageCallback(void *context, AImageReader *reader)
{
Log::Debug(TAG) << "previewImageCallback" << Log::Endl;
AImage *previewImage = nullptr;
auto status = AImageReader_acquireLatestImage(reader, &previewImage);
if(status !=AMEDIA_OK)
{
return;
}
std::thread processor([=]()
{
uint8_t *dataY = nullptr;
uint8_t *dataU = nullptr;
uint8_t *dataV = nullptr;
int lenY = 0;
int lenU = 0;
int lenV = 0;
AImage_getPlaneData(previewImage, 0, (uint8_t**)&dataY, &lenY);
AImage_getPlaneData(previewImage, 1, (uint8_t**)&dataU, &lenU);
AImage_getPlaneData(previewImage, 2, (uint8_t**)&dataV, &lenV);
uchar buff[lenY+lenU+lenV];
memcpy(buff+0,dataY,lenY);
memcpy(buff+lenY,dataV,lenV);
memcpy(buff+lenY+lenV,dataU,lenU);
cv::Mat yuvMat(480+240,640,CV_8UC1,&buff);
cv::Mat rgbMat;
cv::cvtColor(yuvMat,rgbMat,cv::COLOR_YUV2RGB_NV21,3);
//colorBuffer defined elsewhere
memcpy((char*)colorBuffer,rgbMat.data,640*480*3);
【问题讨论】:
-
预期的和实际的图像可能会有所帮助
-
@AlanBirtles 这些是来自相机的实时帧,但我添加了我手机的屏幕截图以显示它的样子。
标签: android c++ opencv android-ndk