#pragma once #include #include "NeoArithStandardDll.h" class SimTargetImage_Y16 { public: SimTargetImage_Y16(int w,int h); ~SimTargetImage_Y16(); public: void setBackGround(int gray,int std); void addTarget(int x, int y, int w, int h, int gray); // 获取Y16数据 unsigned short* getImageData(); cv::Mat getMatRGB(); private: cv::Mat Y8Mat;//显示图像 unsigned short* pSrc; int nImageWidth; int nImageHeight; }; // 目标结构体 struct Target { float x, y; // 目标位置 float width, height; // 目标尺寸 float vx, vy; // 水平和垂直速度 float vw, vh; // 尺寸变化速度 cv::Scalar color; // 目标颜色(适用于 RGB) bool useTexture; // 使用贴图 cv::Mat texture_cur; // 贴图 cv::Mat alaph_cur; // 贴图alaph // 保存原始贴图状态 cv::Mat texture; // 贴图 cv::Mat alaph; // 贴图alaph Target() { }; void updatePosition(int frameWidth, int frameHeight) { // 更新位置 x += vx; y += vy; width += vw; height += vh; // 检测边界并反弹 if (x <= width || x + width >= frameWidth) vx = -vx; if (y <= height || y + height >= frameHeight) vy = -vy; // 保持目标在图像范围内 x = std::max(0.0f, std::min(x, frameWidth - width)); y = std::max(0.0f, std::min(y, frameHeight - height)); } void updateTexture() { if(useTexture && (texture_cur.cols != height || texture_cur.rows != width)) { texture_cur = cv::Mat(height,width,CV_8UC3); alaph_cur = cv::Mat(height,width,CV_8UC1); cv::resize(texture,texture_cur,cv::Size(width,height)); cv::resize(alaph,alaph_cur,cv::Size(width,height)); } } void addTexture(unsigned char* png_data,int Len) { std::vector img_data(png_data, png_data + Len); cv::Mat pic = cv::imdecode(img_data, cv::IMREAD_UNCHANGED); // cv::imshow("pic",pic); // cv::waitKey(0); // 分离前景的 RGB 和 Alpha 通道 cv::Mat bgr, alpha; std::vector channels(4); cv::split(pic, channels); cv::merge(std::vector{channels[0], channels[1], channels[2]}, bgr); useTexture = true; alaph = channels[3]; // Alpha 通道 texture = bgr; alaph_cur = channels[3]; texture_cur = bgr; } }; class SimTargetImage { public: SimTargetImage(int w,int h); ~SimTargetImage(){}; public: // 状态更新 void update(); // 设置背景 void setBackGround(int gray,int std); // 增加一个目标 void addTarget(Target t); // 增加一个遮挡 void addOcc(Target t); public: cv::Mat getImageRGB(); cv::Mat getImageY16(); cv::Mat getImageY8(); cv::Mat getImageNV12(); Target* getTarget(int id); private: void drawObj(Target t); void drawOcc(Target t); cv::Mat m_BaseMat;//图像帧(RGB) cv::Mat m_CurMat;//图像帧(RGB) std::vector m_targetList; std::vector m_OccList; int m_imgW; int m_imgH; // 各类型输出结果 private: cv::Mat matY8; cv::Mat matY16; cv::Mat matNV12; }; // 16位调光 void Map16BitTo8Bit(unsigned short* psh16BitData, long lDataLen, unsigned char* pby8BitData); void showArithInfo(cv::Mat src,ARIDLL_OUTPUT* output);