альфа-смешивание с использованием openCV - PullRequest
2 голосов
/ 26 февраля 2012

Я пытаюсь смешать 2 ROI вместе.Одним из них является ROI изображения в градациях серого, а другим - ROI бинарного изображения, которое я инвертировал с помощью cvNot, чтобы получить объект белого цвета, а фон - черный.Вывод, который я хочу, противоположен тому, что я сейчас получаю с моим кодом.На рисунке бинарное изображение помещено поверх изображения в градациях серого, но я хочу, чтобы оно было наоборот, чтобы в этом месте на изображении присутствовал белый цвет, то это было бы тело в оттенках серого, а фон в градациях серого затем черный.alpha blended output

Это мой код.Пожалуйста, кто-нибудь пройдет через это и скажет мне, что нужно изменить, чтобы получить результат, который я описал выше?Я очень, очень ценю это.

#include "cv.h"
#include "highgui.h"

int main( int argc, char* argv ) {

CvCapture *capture = NULL;
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
if(!capture){
    return -1;
}

IplImage* color_frame = NULL ;
IplImage* new_frame = NULL ; 
    IplImage* res_frame = NULL;
int thresh = 17;    

int frameCount=0;//Counts every 5 frames
cvNamedWindow( "contours", CV_WINDOW_AUTOSIZE );

while(1) {
    color_frame = cvQueryFrame( capture );//Grabs the frame from a file
    if( !color_frame ) break;

    new_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);
    if( !color_frame ) break;// If the frame does not exist, quit the loop

    res_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);

    frameCount++;
    if(frameCount==5)
    {
        cvCvtColor(color_frame, new_frame, CV_BGR2GRAY);
        cvThreshold(new_frame, res_frame, thresh, 255, CV_THRESH_BINARY);
        cvErode(res_frame, res_frame, NULL, 1);
        cvDilate(res_frame, res_frame, NULL, 1);
        cvNot (res_frame, res_frame);

        int x = 75;
        int y = 5;
        int width = 125;
        int height = 1500;

        double alpha = 1;
        double beta = 1;

        cvSetImageROI(res_frame, cvRect(x, y, width, height));
        cvSetImageROI(new_frame, cvRect(x, y, width, height));

        //cvResetImageROI(new_frame);
        cvAddWeighted(res_frame, alpha, new_frame, beta, 0.0, res_frame);
        cvShowImage("contours", res_frame);

         frameCount=0;
    }
    char c = cvWaitKey(33);
    if( c == 27 ) break;
}

cvReleaseImage(&color_frame);
cvReleaseImage(&new_frame);
cvReleaseImage(&res_frame);
cvReleaseCapture( &capture );
cvDestroyWindow( "contours" );

return 0;
}

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Исходя из вашей функции порога, я предполагаю, что вы хотите видеть черную / темно-серую часть изображения. Вместо cvAddWeighted вы можете использовать res_frame в качестве маски для выбора соответствующей части new_frame следующим образом:

cvCopy(new_frame,new2_frame,res_frame);

С маскированной копией вы создаете дубликат new_frame в new2_frame только в тех пикселях, где res_frame не равен нулю. new2_frame должен быть того же размера, что и new_frame, или того же размера roi, если вам все еще нужны roi.

1 голос
/ 26 февраля 2012

@ rics, ты это имел ввиду?

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) {

CvCapture *capture = NULL;
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
if(!capture){
    return -1;
}

IplImage* color_frame = NULL ;
IplImage* new_frame = NULL ; 
IplImage* res_frame = NULL;
IplImage* new2_frame = NULL ;
int thresh = 17;    

int frameCount=0;//Counts every 5 frames
cvNamedWindow( "contours", CV_WINDOW_AUTOSIZE );

while(1) {
    color_frame = cvQueryFrame( capture );//Grabs the frame from a file
    if( !color_frame ) break;

    new_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);
    if( !color_frame ) break;// If the frame does not exist, quit the loop

    res_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);
    new2_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);


    frameCount++;
    if(frameCount==5)
    {
        cvCvtColor(color_frame, new_frame, CV_BGR2GRAY);
        cvThreshold(new_frame, res_frame, thresh, 255, CV_THRESH_BINARY);
        cvErode(res_frame, res_frame, NULL, 1);
        cvDilate(res_frame, res_frame, NULL, 1);
        cvNot (res_frame, res_frame);

        int x = 75;
        int y = 5;
        int width = 125;
        int height = 1500;

        //double alpha = 1;
        //double beta = 1;

        cvSetImageROI(res_frame, cvRect(x, y, width, height));
        cvSetImageROI(new_frame, cvRect(x, y, width, height));

        //cvResetImageROI(new_frame);
        //cvAddWeighted(res_frame, alpha, new_frame, beta, 0.0, res_frame);
        cvCopy(new_frame,new2_frame,res_frame);
        cvShowImage("contours", new2_frame);

         frameCount=0;
    }
    char c = cvWaitKey(33);
    if( c == 27 ) break;
}

cvReleaseImage(&color_frame);
cvReleaseImage(&new_frame);
cvReleaseImage(&res_frame);
cvReleaseImage(&new2_frame);
    cvReleaseCapture( &capture );
cvDestroyWindow( "contours" );

return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...