我使用的是openCV 3.1.0(我试过2.4.9,有同样的问题)。我想输出一个HSV mat到JPEG:
// .. Getting JPEG content into memory
// JPEG to mat
Mat imgBuf=Mat(1, jpegContent, CV_8UC3, jpegSize);
Mat imgMat=imdecode(imgBuf, CV_LOAD_IMAGE_COLOR);
free(jpegContent);
if(imgMat.data == NULL) {
// Some error handling
}
// Now the JPEG is decoded and reside in imgMat
cvtColor(imgMat, imgMat, CV_BGR2HSV); // Converting to HSV
Mat tmp;
inRange(imgMat, Scalar(0, 0, 0), Scalar(8, 8, 8), tmp); // Problem goes here
cvtColor(tmp, imgMat, CV_HSV2BGR);
// Mat to JPEG
vector<uchar> buf;
imencode(".jpg", imgMat, buf, std::vector<int>());
outputJPEG=(unsigned char*)malloc(buf.size());
memcpy(outputJPEG, &buf[0], buf.size());
// ... Output JPEG
问题是,当我使用inrange
执行cvtcolor(tmp,imgMat,CV_HSV2BGR)
时,我的程序将失败:
OpenCV错误:断言失败(scn==3&(dcn==3 dcn==4)&(depth==CV_8U depth==CV_32F)),位于cvtColor文件/home/pi/OpenCV/src/opencv-3.1.0/modules/imgproc/src/color.cpp第8176行
在抛出“cv::exception”的实例后调用了terminate what():/home/pi/opencv/src/opencv-3.1.0/modules/imgproc/src/color.cpp:8176:error:(-215)scn==3&&(dcn==3 dcn==4)&(depth==CV_8U depth==CV_32F)在函数cvtColor中
如果我删除了inrange
,程序就可以正常工作。我尝试删除cvtColor调用,让imencode
来完成它的工作,自动将HSV转换为BGR,然后转换为JPEG。这一次,没有任何断言失败,但我得到了损坏的JPEG图像,正如GStreamer所抱怨的:
gstrtpjpegpay.c(581):gst_rtp_jpeg_pay_read_sof():/gstpipeline:pipeline0/gstrtpjpegpay:rtpjpegpay0警告:来自元素/gstpipeline:pipeline0/gstrtpjpegpay:rtpjpegpay0:错误的SOF长度11。
同样,删除inrange
也解决了这个问题,它产生了良好的JPEG数据。
那么,我是不正确地调用inrange
导致损坏的图像数据吗?如果是,使用inrange
的正确方法是什么?
inrange
生成单通道二进制矩阵,即具有0
或255
值的CV_8UC1
矩阵。
因此,您不能使用hsv2bgr
转换tmp
,因为源映像tmp
没有3个通道。
OpenCV确切地告诉您:scn(源通道)不是3。
由于您可能只想保留您范围内的部分图像,然后将其转换为BGR,您可以:
imgmat.setto(标量(0,0,0),~tmp);
CVTCOLOR(imgMat,imgMat,CV_HSV2BGR);
问题内容: 我在互联网上找到了一种将RGB值转换为HSV值的方法。不幸的是,当值是R = G = B时,由于0/0操作,我得到的是NaN。 您是否知道Java中是否存在用于此转换的实现方法,或者当我获得0/0除法以获取正确的HSV值时该怎么办? 这是我的方法,它是根据Internet上的一些代码改编而成的: 问题答案: 我很确定您想要的是RGBtoHSB
问题内容: 我需要准确地将HSB转换为RGB,但是我不确定如何解决将小数转换为整数而不四舍五入的问题。这是我从colorpicker库中获得的当前函数: 如您所见,此函数的不准确性来自Math.round 问题答案: / accepts parameters * h Object = {h:x, s:y, v:z} * OR * h, s, v / function HSVtoRGB(h, s,
本文向大家介绍在Python中使用OpenCV将RGB格式的图像转换为HSV格式的图像,包括了在Python中使用OpenCV将RGB格式的图像转换为HSV格式的图像的使用技巧和注意事项,需要的朋友参考一下 的HSV是另一种类型的颜色空间,其中H代表色相,S表示饱和度和V代表值。 一个色调代表颜色。从0度到360度的角度。 角度 颜色 0-60 红 60-120 黄色 120-180 绿色 180
问题内容: 我在将简单的PNG转换为JPEG格式时遇到问题。我正在使用以下代码: … … 我最后遇到一个JAI异常-> java.lang.RuntimeException:只能写入1或3字节的字节数据。在com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148)… 退出选项。有什么建议吗? 问题答案
问题内容: 如何将a转换为in ? 我正在使用JAVA包装器(不是 JavaCV )。由于我是新手,因此在理解工作方式方面存在一些问题。 我想做这样的事情。(根据Ted W.的回复): 这行不通。只是一张尺寸正确的黑色图片。 问题答案: 我还试图做同样的事情,因为需要将经过处理的图像与两个库结合在一起。而我一直试图做的是把中,而不是RGB值。而且有效!所以我做的是: 1,转换为字节数组 2.然后,
问题内容: 我正在寻找将JPEG文件流转换为TIFF文件的Java API。我查看了JAI,但未找到与我正在查看的内容类似的内容。 有人可以指出我要这样做的一个好的API吗? 问题答案: 这里有一个例子 http://log.robmeek.com/2005/08/write-tiff-in- java.html