优化图像size的控制

serial
BlueMatthew 1 year ago
parent 90affb5731
commit 980b9b3b66

@ -1042,9 +1042,6 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat)
} }
} }
#ifdef _DEBUG #ifdef _DEBUG
cv::Scalar scalarRed(0, 0, 255); // red cv::Scalar scalarRed(0, 0, 255); // red

@ -17,7 +17,9 @@
#include <string> #include <string>
#include <thread> #include <thread>
#include <android/log.h> #include <android/log.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp> #include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include "mat.h" #include "mat.h"
#include "gpu.h" #include "gpu.h"
#include "Camera2Helper.h" #include "Camera2Helper.h"
@ -211,9 +213,7 @@ int NdkCamera::open(const std::string& cameraId) {
// DisplayDimension maxJPG(0, 0); // DisplayDimension maxJPG(0, 0);
foundIt = false; foundIt = false;
unsigned long long minRatio = -1;
DisplayDimension temp; DisplayDimension temp;
unsigned long long pixels = (unsigned long long)mWidth * mHeight;
for (int i = 0; i < e.count; i += 4) for (int i = 0; i < e.count; i += 4)
{ {
@ -226,12 +226,9 @@ int NdkCamera::open(const std::string& cameraId) {
DisplayDimension res(e.data.i32[i + 1], e.data.i32[i + 2]); DisplayDimension res(e.data.i32[i + 1], e.data.i32[i + 2]);
if (!disp.IsSameRatio(res)) if (!disp.IsSameRatio(res))
{ {
unsigned long long ps = res.width() * res.height(); if (res.width() >= mWidth && res.height() >= mHeight)
unsigned long long ratio = (ps >= pixels) ? (ps - pixels) : (pixels - ps);
if (ratio < minRatio)
{ {
temp = res; temp = res;
minRatio = ratio;
} }
continue; continue;
} }
@ -240,9 +237,7 @@ int NdkCamera::open(const std::string& cameraId) {
{ {
foundIt = true; foundIt = true;
foundRes = res; foundRes = res;
}/* else if (format == AIMAGE_FORMAT_JPEG && res > maxJPG) { }
maxJPG = res;
}*/
} }
} }
@ -260,6 +255,8 @@ int NdkCamera::open(const std::string& cameraId) {
return 1; return 1;
} }
// foundRes.Flip();
// query faceing // query faceing
acamera_metadata_enum_android_lens_facing_t facing = ACAMERA_LENS_FACING_FRONT; acamera_metadata_enum_android_lens_facing_t facing = ACAMERA_LENS_FACING_FRONT;
{ {
@ -400,7 +397,8 @@ int NdkCamera::open(const std::string& cameraId) {
// setup imagereader and its surface // setup imagereader and its surface
{ {
media_status_t mstatus = AImageReader_new(foundRes.width(), foundRes.height(), AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader); // media_status_t mstatus = AImageReader_new(foundRes.width(), foundRes.height(), AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader);
media_status_t mstatus = AImageReader_new(foundRes.org_width(), foundRes.org_height(), AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader);
if (mstatus == AMEDIA_OK) if (mstatus == AMEDIA_OK)
{ {
@ -800,10 +798,29 @@ void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_hei
} }
// nv21_rotated to rgb // nv21_rotated to rgb
cv::Mat rgb(h, w, CV_8UC3); cv::Mat rgb;
if (w == mWidth && h == mHeight)
{
rgb.create(h, w, CV_8UC3);
// ncnn::yuv420sp2rgb(nv21_rotated.data, w, h, rgb.data); // ncnn::yuv420sp2rgb(nv21_rotated.data, w, h, rgb.data);
ncnn::yuv420sp2rgb_nv12(yuv420data, w, h, rgb.data); ncnn::yuv420sp2rgb_nv12(yuv420data, w, h, rgb.data);
}
else
{
cv::Mat org(h, w, CV_8UC3);
ncnn::yuv420sp2rgb_nv12(yuv420data, w, h, org.data);
if (w * mHeight == h * mWidth) // Same Ratio
{
cv::resize(org, rgb, cv::Size(mWidth, mHeight));
}
else
{
// Crop image
int left = (w - mWidth) / 2;
int top = (h - mHeight) / 2;
rgb = org(cv::Range(top, top + mHeight), cv::Range(left, left + mWidth));
}
}
on_image(rgb); on_image(rgb);
} }

Loading…
Cancel
Save