【发布时间】: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 -
它现在工作得很好,谢谢。