两个图像的乘积,其中图像在OPEN CV中具有不同的模型
Multiplication of 2 images where the images have different models in OPEN CV
我正在尝试将不同模型的两个图像相乘,在我的例子中是HSV和YCRCB
我每次都会得到"向量越界错误"。我已经检查了要相乘的输入图像的大小、行和列的数量。我知道这个值超过了255。
我试图实现这种方法opencv-image乘法,但代码有很多MAT必须初始化。这也让我提出了一个问题,即具有1个以上通道的图像是否可以相乘。也尝试了直接乘法,但它不起作用,所以尝试了按通道相乘。为了让事情变得更容易,我使用了循环方法,但随后出现了错误。
关于代码和原因的简短总结:我将其用于皮肤检测,但希望进一步减少噪音。我认为这可以通过将阈值运算生成的2个输出图像相乘来实现(对于HSV&YCRCB)。由于这些图像在图像中具有不同的噪声,因此乘法的输出将具有更少的噪声(我在不同的屏幕上看到了输出,重叠区域非常小),因此这几乎可以随时检测皮肤颜色,并且噪声将是最小的,因此将有助于更好地跟踪皮肤。
下面给出的代码并不完整,因为它永远不会执行到最后。之后进行形态学和扩张操作,仅此而已。
这是我第一次在Stack Overflow上提问,我还在学习Open CV。对不起,如果我描述得太多了,欢迎所有建议。非常感谢。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencvcv.h>
#include <opencvhighgui.h>
#include <iostream>
#include <opencv2imgprocimgproc.hpp>
using namespace cv;
using namespace std;
char key;
Mat image,hsv,ycr;
vector<Mat> channels,ycrs,threshold_output;
int main()
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
{
cout << "Cannot open the web cam" << endl;
return -1;
}
while(1)
{
cap>>image;
cvtColor( image, ycr, CV_BGR2YCrCb ); //Converts into YCRCB
cvtColor( image, hsv, CV_BGR2HSV ); //Converts into HSV
Mat imgThresholded;
Mat imgThresholded1;
inRange(ycr, Scalar(0, 140,105 ), Scalar(255, 165,135), imgThresholded1); //for yrcrcb range
inRange(hsv, Scalar(0, 48,150 ), Scalar(20, 150,255), imgThresholded); //for hsv range
split(imgThresholded1, channels);
split(imgThresholded, ycrs);
for( int i = 0; i <3 ; i++ )
{
multiply(channels[i],ycrs[i], threshold_output[i], 1,-1 );
}//code breaks here
即使inRange
的输入是多通道的,inRange
的输出也将是单通道CV_8UC1
。
原因是inRange
计算了一个笛卡尔交点:
- 如果ALL为true,则结果(x,y)为true(uchar为255):
- 对于第一个通道,
lower[0] <= img(x, y)[0] <= upper[0]
,AND - 对于第二个通道
lower[1] <= img(x, y)[1] <= upper[1]
,AND - 等等
- 对于第一个通道,
换句话说,在根据下限和上限检查每个通道的像素值后,逻辑结果是图像通道上的逻辑与运算。
"Boiled down"是我的口语化方式,指的是归约或折叠,其中函数可以接受任意数量的参数,并且可以"归约"为单个值。求和、乘法、字符串串联等
因此,没有必要在cv::inRange
的输出上使用cv::split
。事实上,因为输出只有一个通道,所以调用channels[1]
或ycrs[1]
将是一种未定义的行为,这将导致调试构建异常和未定义行为,或者导致发布构建崩溃或内存损坏。
- 将"打开的CV图像"中的"颜色"转换为整数格式
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 使用 cv::不扭曲不失真和居中图像
- 如何在OpenCV 3.4.7中计算CV_32FC1 cv::GpuMat图像的(范围)直方图
- 如何在 dlib 的 array2d 图像上从 dlib::rectangle 创建 cv::Mat<rgb_pixel> ?
- 如何从C 中的CV :: MAT图像中有效提取某些像素
- C++/openCV - 为什么显示图像会产生 Linux 分割错误?(打开CV错误?
- 循环浏览捕获的图像 vector<cv::Mat>
- 将打开的CV的重映射功能与类型CV_8SC1的源图像一起使用
- 表示RGB图像的浮点数组的初始CV::MAT
- 将 cv::Mat 转换为穿山甲::图像
- 无法使用cv :: imwrite保存垫子图像在JNI本机代码OPENCV中
- 使用Open CV和Java单击Android时,获取图像尺寸
- 为什么CV :: MAT的向量总是返回第一个图像
- 图像打开时出错(使用打开的 CV C++代码)
- 使用16位签名格式打开CV不起作用..裁剪图像并重新调整图像大小
- 使用 cv::P oint 作为参数访问图像
- 将拜耳RGGB转换为CV图像(RGB)
- 如何在打开的cv c ++中单击鼠标右键时从视频中捕获图像
- 将opencv图像cv::Mat格式转换为c# BitmapImage