当前位置: 首页 > 知识库问答 >
问题:

使用inRange后,在openCV中将HSV转换为BGR或HSV转换为JPEG时出错

冯星阑
2023-03-14

我使用的是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的正确方法是什么?

共有1个答案

赵俊晤
2023-03-14

inrange生成单通道二进制矩阵,即具有0255值的CV_8UC1矩阵。

因此,您不能使用hsv2bgr转换tmp,因为源映像tmp没有3个通道。

OpenCV确切地告诉您:scn(源通道)不是3。

由于您可能只想保留您范围内的部分图像,然后将其转换为BGR,您可以:

  1. 将范围外的所有内容设置为黑色:imgmat.setto(标量(0,0,0),~tmp);
  2. 将结果图像转换为BGR: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