2014-09-27 4 views
0

Я пытаюсь умножить два изображения разных моделей, в моем случае HSV и YCRCB.
Каждый раз, когда я получаю «вектор из связанной ошибки». Я проверил размеры умножаемых входных изображений, количество строк и столбцов. Я знаю, что значение превышает 255.
Я попытался реализовать этот метод opencv - image multiplication, но код имеет путь к множеству MAT, которые должны быть инициализированы. Это также заставляет меня задаться вопросом, можно ли умножать изображения с более чем одним каналом. Также попробовал прямое умножение, и он не работает, поэтому попытался умножить канал мудрый. Чтобы упростить задачу, я использовал метод loop, но затем произошла ошибка.Умножение 2 изображений, в которых изображения имеют разные модели в OPEN CV

Краткое описание кода и причины для этого: я использую его для обнаружения кожи, но хочу еще больше уменьшить шум. Я думаю, что это может быть сделано путем умножения двух выходных изображений, генерируемых пороговыми операциями (для HSV YCRCB). Поскольку эти изображения имеют разные шумы на изображении, выход умножения будет иметь еще меньший шум (я видел выход на разных экранах, перекрывающиеся области очень малы), следовательно, это может обнаруживать цвет кожи практически все время, и шум будет быть минимальным и, таким образом, поможет лучше отслеживать кожу.

Код, приведенный ниже, не является полным, поскольку он никогда не выполняется до конца. После этого выполняются морфологические и дилатационные операции, вот и все.
Это мой первый вопрос, связанный с переполнением стека, и я все еще изучаю 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 

ответ

1

Даже если входной сигнал inRange является многоканальным, выход inRange будет одноканальным CV_8UC1.

Причина заключается в том, что inRange вычисляет декартово пересечение:

  • Результат (х, у) истинно (Uchar 255), если ВСЕ из них являются истинными:
    • Для первого канала, lower[0] <= img(x, y)[0] <= upper[0], И
    • Для второго канала, lower[1] <= img(x, y)[1] <= upper[1], И
    • И так далее.

Другими словами, после того, как он проверил значения пикселов каждого канала против нижней и верхней границей, логический результат затем «сводились» логико-А операция по каналам изображения.

«Свернутый вниз» - это мой разговорный способ ссылаться на reduction, or fold, где функция может принимать произвольное количество аргументов и может быть «уменьшена» до одного значения. Суммирование, умножение, конкатенация строк и т. Д.

Поэтому нет необходимости использовать cv::split на выходе cv::inRange.Фактически, поскольку выход имеет только один канал, вызов channels[1] или ycrs[1] будет неопределенным поведением, которое либо вызовет исключение для отладки-построения и неопределенного поведения, либо сбоя при сбое или повреждение памяти для сборки release.

+0

Большое спасибо. – udit7395