【问题标题】:Error when converting from HSV to BGR, or HSV to JPEG in openCV after using inRange使用 inRange 后在 openCV 中从 HSV 转换为 BGR 或 HSV 转换为 JPEG 时出错
【发布时间】:2016-06-20 12:25:29
【问题描述】:

我正在使用 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 错误:在 cvtColor,文件 /home/pi/opencv 中断言失败 (scn == 3 && (dcn == 3 || dcn == 4) && (depth == CV_8U || depth == CV_32F)) /src/opencv-3.1.0/modules/imgproc/src/color.cpp,第 8176 行

在抛出 'cv::Exception' 的实例后调用终止 什么():/home/pi/opencv/src/opencv-3.1.0/modules/imgproc/src/color.cpp:8176:错误:(-215)scn == 3 &&(dcn == 3 || dcn == 4) && (depth == CV_8U || depth == CV_32F) in function 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 为您提供CV_8UC1 类型的二进制矩阵。您无法将其转换为 HSV
  • 它现在工作得很好,谢谢。

标签: c++ opencv hsv


【解决方案1】:

inRange 生成单通道二进制矩阵,即CV_8UC1 矩阵,其值为0255

因此您无法将tmpHSV2BGR 转换,因为源图像tmp 没有3 个通道。

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


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

  1. 设置为黑色范围之外的所有内容:imgMat.setTo(Scalar(0,0,0), ~tmp);
  2. 将生成的图像转换为 BGR:cvtColor(imgMat, imgMat, CV_HSV2BGR);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 2017-07-01
    • 2014-01-28
    • 1970-01-01
    • 2016-04-14
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多