OpenCV(C+;+;)-设置像素的HSV值
我有一个RGB图像,我把它转换成了HSV,我的目标是将每个不符合特定色调值(100)的像素设置为黑色。所以H=S=V=0 我有这个代码:(frame3是HSV Mat图像,色调=100)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
对于(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下面的答案是一个更好的解决方案。太好了!我希望保留我的代码结构,非常感谢!太好了!我希望保留我的代码结构,非常感谢!