基于OpenCV实现实时替换指定颜色的技术问题咨询
OpenCV C++ 实时替换指定颜色实现方案
核心逻辑:你已经生成了红色区域的二值掩码BW,仅需通过掩码对原图对应位置赋值即可完成颜色替换,对应Python参考代码的赋值逻辑,C++ 中使用Mat::setTo方法实现。
修改后完整代码
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/videoio/videoio.hpp> #include <iostream> using namespace cv; using namespace std; int RoboX = 300; int RoboY = 10; Mat VRobo(Mat gbr, int arah); int main() { VideoCapture kameraku(0); Mat image; Mat image2; Mat hsv; Mat BW; Mat element; namedWindow("Kamera", WINDOW_AUTOSIZE); namedWindow("Convert", WINDOW_AUTOSIZE); // 新增替换结果窗口 namedWindow("替换结果", WINDOW_AUTOSIZE); while (1) { kameraku >> image; kameraku >> image2; imshow("Kamera", image); cvtColor(image2, hsv, CV_BGR2HSV); inRange(hsv, Scalar(0, 60, 60), Scalar(5, 255, 255), BW); element = getStructuringElement(MORPH_ELLIPSE, Size(5, 5)); erode(BW, BW, element); erode(BW, BW, element); erode(BW, BW, element); dilate(BW, BW, element); dilate(BW, BW, element); dilate(BW, BW, element); // 新增颜色替换逻辑:将掩码区域替换为蓝色(OpenCV默认BGR格式,蓝色对应(255,0,0)) image2.setTo(Scalar(255, 0, 0), BW); imshow("Convert", BW); // 新增替换结果展示 imshow("替换结果", image2); char c = (char)waitKey(25); if (c == 27) break; } kameraku.release(); destroyAllWindows(); return 0; }
关键逻辑说明
setTo方法的第二个参数为掩码,仅会修改掩码中数值非0的像素位置,符合精准替换要求- OpenCV默认使用BGR色彩顺序存储彩色图像,你可以修改
Scalar的三个参数值替换为任意目标颜色,比如替换为绿色就是Scalar(0,255,0),替换为红色就是Scalar(0,0,255)
优化建议
- 红色的Hue值在HSV环形色彩空间中分为两段,除了0-5区间,170-180区间也属于红色范围,你可以合并两个区间的掩码提升红色检测的完整性:
Mat BW2; inRange(hsv, Scalar(170, 60, 60), Scalar(180, 255, 255), BW2); BW = BW + BW2;
- 重复3次腐蚀+3次膨胀的操作等价于先开运算后闭运算,可以直接用
morphologyEx简化代码:
morphologyEx(BW, BW, MORPH_OPEN, element); morphologyEx(BW, BW, MORPH_CLOSE, element);
内容的提问来源于stack exchange,提问作者Alan Emilio Admaja Lie
相关产品推荐
相关产品推荐

