OpenCV(C+;+;)-设置像素的HSV值

OpenCV(C+;+;)-设置像素的HSV值,opencv,hsv,Opencv,Hsv,我有一个RGB图像,我把它转换成了HSV,我的目标是将每个不符合特定色调值(100)的像素设置为黑色。所以H=S=V=0 我有这个代码:(frame3是HSV Mat图像,色调=100) 对于(int i=0;i您可以: 构建一个掩码,其中H通道等于100,而不考虑S、V通道的值(使用inRange) 根据掩码将frame3设置为零(使用setTo) 比如: Mat frame3; // CV_8UC3, HSV image Mat mask; inRange(frame3, Scalar

我有一个RGB图像,我把它转换成了HSV,我的目标是将每个不符合特定色调值(100)的像素设置为黑色。所以H=S=V=0

我有这个代码:(frame3是HSV Mat图像,色调=100)

对于(int i=0;i您可以:

  • 构建一个
    掩码
    ,其中H通道等于100,而不考虑S、V通道的值(使用
    inRange
  • 根据掩码将
    frame3
    设置为零(使用
    setTo
比如:

Mat frame3; // CV_8UC3, HSV image

Mat mask;
inRange(frame3, Scalar(100,0,0), Scalar(100, 255, 255), mask);

frame3.setTo(Scalar(0,0,0), mask);

要保留代码结构,您需要修改实际值,而不是值的副本。您可以通过保留对值的引用来执行此操作:

 Vec3b& hsv = frame3.at<Vec3b>(i, j);
 if (hsv[0] != hue) {
    hsv[0] = 0;
    hsv[1] = 0;
    hsv[2] = 0;
 }  
Vec3b&hsv=frame3.at(i,j);
如果(hsv[0]!=色调){
hsv[0]=0;
hsv[1]=0;
hsv[2]=0;
}  
您可以:

  • 构建一个
    掩码
    ,其中H通道等于100,而不考虑S、V通道的值(使用
    inRange
  • 根据掩码将
    frame3
    设置为零(使用
    setTo
比如:

Mat frame3; // CV_8UC3, HSV image

Mat mask;
inRange(frame3, Scalar(100,0,0), Scalar(100, 255, 255), mask);

frame3.setTo(Scalar(0,0,0), mask);

要保留代码结构,您需要修改实际值,而不是值的副本。您可以通过保留对值的引用来执行此操作:

 Vec3b& hsv = frame3.at<Vec3b>(i, j);
 if (hsv[0] != hue) {
    hsv[0] = 0;
    hsv[1] = 0;
    hsv[2] = 0;
 }  
Vec3b&hsv=frame3.at(i,j);
如果(hsv[0]!=色调){
hsv[0]=0;
hsv[1]=0;
hsv[2]=0;
}  

您只是将HSV值的复制值指定为0,而不是原始值。true,但即使我将其更改为将实际值设置为0,它也不起作用:(这是因为
val
返回副本,不允许修改基础值。要手动执行此操作,您需要使用
运算符[]
用于
Vec3b
,因为它返回一个引用并可以修改。但是@Miki下面的答案是一个更好的解决方案。您只是将HSV值的复制值指定为0,而不是原始值。true,但即使我将其更改为将实际值设置为0,它也不起作用:(这是因为
val
返回一个副本,不允许修改基础值。要手动执行此操作,您需要使用
运算符[]
用于
Vec3b
,因为它返回一个引用并可以修改。但是@Miki下面的答案是一个更好的解决方案。太好了!我希望保留我的代码结构,非常感谢!太好了!我希望保留我的代码结构,非常感谢!