gpt4 book ai didi

c++ - OPENCV 中图像具有不同模型的 2 张图像的乘法

转载 作者:行者123 更新时间:2023-11-28 06:40:26 24 4
gpt4 key购买 nike

我正在尝试将不同模型的两个图像相乘,在我的例子中是 HSV 和 YCRCB。
我每次都收到“vector 超出范围错误”。我检查了相乘的输入图像的大小、行数和列数。我知道这个值超过了 255。
我试图实现这个方法opencv - image multiplication ,但代码有许多必须初始化的 MAT 的方法。这也让我问了一个问题,是否可以将多于 1 个 channel 的图像相乘。还尝试了直接乘法但它不起作用,所以尝试明智地乘以 channel 。为了方便起见,我使用了循环方法,但随后发生了错误。

关于代码的简短摘要和这样做的原因:我将它用于皮肤检测,但想进一步减少噪音。我认为这可以通过将阈值操作(对于 HSV 和 YCRCB)生成的 2 个输出图像相乘来完成。由于这些图像在图像中具有不同的噪声,因此乘法的输出将具有更少的噪声(我已经在不同的屏幕上看到输出,重叠区域非常小)因此这几乎可以在所有时间检测肤色并且噪声会最小化,因此有助于更好地跟踪皮肤。

下面给出的代码并不完整,因为它永远不会执行到最后。在此之后进行形态学和膨胀操作,仅此而已。
这是我第一次在 Stack Overflow 上提问,我还在学习 Open CV。抱歉,如果我描述过度,欢迎所有建议。谢谢。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <iostream>
#include <opencv2\imgproc\imgproc.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是多 channel 的,inRange 的输出将是单 channel CV_8UC1 .

原因是inRange计算笛卡尔交集:

  • 如果以下所有为真,则结果 (x, y) 为真(uchar of 255):
    • 对于第一个 channel ,lower[0] <= img(x, y)[0] <= upper[0] ,
    • 对于第二个 channel ,lower[1] <= img(x, y)[1] <= upper[1] ,
    • 等等。

换句话说,在它根据下限和上限检查每个 channel 的像素值后,逻辑结果就是“归结”对图像 channel 进行逻辑与运算。

“煮沸”是我对 reduction, or fold 的口语表达方式。 ,其中函数可以接受任意数量的参数,并且可以“减少”为单个值。求和、乘法、字符串连接等

因此没有必要使用 cv::split关于 cv::inRange 的输出.事实上,因为输出只有一个 channel ,调用channels[1]ycrs[1]将是未定义的行为,这将导致调试构建和未定义行为的异常或发布构建的崩溃或内存损坏。

关于c++ - OPENCV 中图像具有不同模型的 2 张图像的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26078691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com