|
|

纯视觉方式检测屏幕像素变化像素队列和区域排除
此软件为开源软件,仅用于学习研究禁止商用转卖
2026/4/14稳定奔放
CXX (“#include ”)CXX (“#include ”)CXX (“#include ”)CXX (“#include ”)CXX (“#include ”)CXX (“#pragma comment(lib, `winmm.lib`)”)CXX (“std::vector<像素点> 获取白色区域( ”)CXX (“const std::vector& 字节集, ”)CXX (“int 宽度, ”)CXX (“int 高度 ”)CXX (“) { ”)CXX (“std::vector<像素点> 结果; ”)CXX (“ ”)CXX (“const int 每像素字节数 = 4; ”)CXX (“std::vector<std::vector> 已访问(高度, std::vector(宽度, false)); ”)CXX (“const int dx[] = { -1, 1, 0, 0 }; ”)CXX (“const int dy[] = { 0, 0, -1, 1 }; ”)CXX (“ ”)CXX (“for (int y = 0; y < 高度; y++) { ”)CXX (“ for (int x = 0; x < 宽度; x++) { ”)CXX (“ if (已访问[y][x]) continue; ”)CXX (“ int 索引 = (y * 宽度 + x) * 每像素字节数; ”)CXX (“ if (索引 + 3 >= (int)字节集.size()) break; ”)CXX (“ ”)CXX (“ unsigned char B = 字节集[索引]; ”)CXX (“ unsigned char G = 字节集[索引 + 1]; ”)CXX (“ unsigned char R = 字节集[索引 + 2]; ”)CXX (“ ”)CXX (“ // 找到白色起点 ”)CXX (“ if (R == 255 && G == 255 && B == 255) { ”)CXX (“ std::queue<std::pair> q; ”)CXX (“ std::vector<像素点> 当前块; ”)CXX (“ ”)CXX (“ q.push({ x, y }); ”)CXX (“ 已访问[y][x] = true; ”)CXX (“ ”)CXX (“ // BFS 搜索整片连续白色区域 ”)CXX (“ while (!q.empty()) { ”)CXX (“ auto curr = q.front(); ”)CXX (“ q.pop(); ”)CXX (“ int cx = curr.first; ”)CXX (“ int cy = curr.second; ”)CXX (“ 当前块.push_back({ cx, cy }); ”)CXX (“ for (int d = 0; d < 4; d++) { ”)CXX (“ int nx = cx + dx[d]; ”)CXX (“ int ny = cy + dy[d]; ”)CXX (“ ”)CXX (“ if (nx < 0 || nx >= 宽度 || ny < 0 || ny >= 高度) continue;”)CXX (“ if (已访问[ny][nx]) continue; ”)CXX (“ ”)CXX (“ int idx = (ny * 宽度 + nx) * 每像素字节数; ”)CXX (“ if (idx + 3 >= (int)字节集.size()) continue; ”)CXX (“ ”)CXX (“ unsigned char b = 字节集[idx]; ”)CXX (“ unsigned char g = 字节集[idx + 1]; ”)CXX (“ unsigned char r = 字节集[idx + 2]; ”)CXX (“ ”)CXX (“ if (r == 255 && g == 255 && b == 255) { ”)CXX (“ 已访问[ny][nx] = true; ”)CXX (“ q.push({ nx, ny }); ”)CXX (“ } ”)CXX (“ } ”)CXX (“ } ”)CXX (“ ”)CXX (“ // 成片大小 > 5 才保留(真正连续区域,丢弃孤立点) ”)CXX (“ if (当前块.size() > 5) { ”)CXX (“ 结果.insert(结果.end(), 当前块.begin(), 当前块.end()); ”)CXX (“ } ”)CXX (“ } ”)CXX (“ } ”)CXX (“} ”)CXX (“ ”)CXX (“return 结果; ”)CXX (“} ”)CXX (“void 生成居中圆形遮罩( ”)CXX (“std::vector& imgBytes, ”)CXX (“int imgWidth, ”)CXX (“int imgHeight, ”)CXX (“int 直径 ”)CXX (“) ”)CXX (“{ ”)CXX (“const int 通道数 = 4; // BGRA ”)CXX (“const int 半径 = 直径 / 2; ”)CXX (“int 圆心X = imgWidth / 2; ”)CXX (“int 圆心Y = imgHeight / 2; ”)CXX (“for (int y = 0; y < imgHeight; y++) ”)CXX (“{ ”)CXX (“ for (int x = 0; x < imgWidth; x++) ”)CXX (“ { ”)CXX (“ int 索引 = (y * imgWidth + x) * 通道数; ”)CXX (“ if (索引 + 3 >= (int)imgBytes.size()) ”)CXX (“ continue; ”)CXX (“ int dx = x - 圆心X; ”)CXX (“ int dy = y - 圆心Y; ”)CXX (“ ”)CXX (“ if ((dx*dx + dy*dy) > (半径*半径)) ”)CXX (“ { ”)CXX (“ imgBytes[索引 + 0] = 0; // B ”)CXX (“ imgBytes[索引 + 1] = 0; // G ”)CXX (“ imgBytes[索引 + 2] = 0; // R ”)CXX (“ imgBytes[索引 + 3] = 255; // A(不透明) ”)CXX (“ } ”)CXX (“ } ”)CXX (“} ”)CXX (“} ”)CXX (“std::vector ConvertBGRAtoBMP( ”)CXX (“const std::vector& bgraPixels, ”)CXX (“int width, ”)CXX (“int height ”)CXX (“) { ”)CXX (“const int headerSize = 54; ”)CXX (“int pixelDataSize = width * height * 4; ”)CXX (“std::vector bmpData(headerSize + pixelDataSize, 0); ”)CXX (“unsigned char* fileHeader = bmpData.data(); ”)CXX (“fileHeader[0] = 'B'; ”)CXX (“fileHeader[1] = 'M'; ”)CXX (“unsigned int fileSize = headerSize + pixelDataSize; ”)CXX (“memcpy(fileHeader + 2, &fileSize, 4); ”)CXX (“unsigned int dataOffset = headerSize; ”)CXX (“memcpy(fileHeader + 10, &dataOffset, 4); ”)CXX (“unsigned char* infoHeader = bmpData.data() + 14; ”)CXX (“unsigned int infoHeaderSize = 40; ”)CXX (“memcpy(infoHeader + 0, &infoHeaderSize, 4); ”)CXX (“memcpy(infoHeader + 4, &width, 4); ”)CXX (“memcpy(infoHeader + 8, &height, 4); ”)CXX (“unsigned short planes = 1; ”)CXX (“memcpy(infoHeader + 12, &planes, 2); ”)CXX (“unsigned short bitCount = 32; ”)CXX (“memcpy(infoHeader + 14, &bitCount, 2); ”)CXX (“unsigned int compression = 0; ”)CXX (“memcpy(infoHeader + 16, &compression, 4); ”)CXX (“memcpy(infoHeader + 20, &pixelDataSize, 4); ”)CXX (“unsigned char* dest = bmpData.data() + headerSize; ”)CXX (“const unsigned char* src = bgraPixels.data(); ”)CXX (“for (int i = 0; i < width * height; i++) { ”)CXX (“ dest[0] = src[0]; // B ”)CXX (“ dest[1] = src[1]; // G ”)CXX (“ dest[2] = src[2]; // R ”)CXX (“ dest[3] = src[3]; // A ”)CXX (“ dest += 4;
</std::pair</std::vector
|
|