I have an RGB image that i converted to HSV and my goal is to set every pixel that doesn't meet a certain hue value (100) to black. So H = S = V = 0.
I have this code: (frame3 is the HSV Mat image, hue = 100)
for (int i = 0; i<frame3.rows; i++)
{
for (int j = 0; j<frame3.cols; j++)
{
Vec3b hsv = frame3.at<Vec3b>(i, j);
int H = hsv.val[0]; //hue
int S = hsv.val[1]; //saturation
int V = hsv.val[2]; //value
if (H != hue) {
H = 0;
S = 0;
V = 0;
}
}
}
imshow("Processed Hue", frame3);
}
But when i run it nothing happens..the image stays the same. When i tried printing out the hsv.val[0] values to the console, i got letters and not numbers.. so i think that kind of points to where the problem is but i still don't know how to fix it.
Any help would be greatly appreciated! Thanks!
You can:
- build a
mask
where H channel equals 100, regardless the values of S,V channels (withinRange
) - set
frame3
to zero according to the mask (withsetTo
)
Something like:
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);
To keep your code structure, you need to modify the actual value, not a copy of the value. You can do that keeping a reference to the value:
Vec3b& hsv = frame3.at<Vec3b>(i, j);
if (hsv[0] != hue) {
hsv[0] = 0;
hsv[1] = 0;
hsv[2] = 0;
}
来源:https://stackoverflow.com/questions/35846581/opencv-c-set-hsv-values-of-a-pixel