|
|
#pragma once
|
|
|
#include <opencv2/opencv.hpp>
|
|
|
#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<uchar> 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<cv::Mat> channels(4);
|
|
|
cv::split(pic, channels);
|
|
|
cv::merge(std::vector<cv::Mat>{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<Target> m_targetList;
|
|
|
std::vector<Target> 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);
|
|
|
|