如何将rgb转换为hsv并在opencv for the screen中使用hsv显示在屏幕上?
using namespace std;
using namespace cv;
extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3View_FindFeatures(JNIEnv* env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray bgra)
{
jbyte* _yuv = env->GetByteArrayElements(yuv, 0);
jint* _bgra = env->GetIntArrayElements(bgra, 0);
Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
Mat mgray(height, width, CV_8UC1, (unsigned char *)_yuv);
//Please make attention about BGRA byte order
//ARGB stored in java as int array becomes BGRA at native level
cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);
env->ReleaseIntArrayElements(bgra, _bgra, 0);
env->ReleaseByteArrayElements(yuv, _yuv, 0);
}
}
以上代码从相机输入yuv并转换为rgb。我知道我需要使用cvtColor函数将rgb转换为hsv但是hsv的Mat应该具有哪些参数?以及如何让它显示而不是rgb
答案 0 :(得分:4)
如果您想将RGB Mat图像转换为HSV色彩空间,您可以这样做:
Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV, 3); //3 is HSV Channel
在Android屏幕中显示之前,您需要将HSV从3频道转换为4频道,因为Android无法在3频道中显示Mat。有关详细信息,请参阅this。像这样的代码:
Imgproc.cvtColor(dst, src, Imgproc.COLOR_HSV2RGBA, 4); // 4 is RGBA Channel
答案 1 :(得分:1)
对于HSV,您应该使用8位无符号。我想你的问题是Hue(理论上它应该在0到360之间,但在openCV Hue中表示的是0,180区间。
如何看待这一点:我将3个通道(H,S,V)中的每一个视为灰色图像。最后,即使在变换后图像也是一样的,只是表示图像的方式也不同。