2016-06-26 2 views
0

현재 처리 된 라이브 비디오 캡처를 표시해야하는 프로젝트에서 작업하고 있습니다. 따라서,이 유사한 것을 사용하고 있습니다 :성능 비디오 캡처 및 처리 중 문제가 발생했습니다.

cv::VideoCapture cap(0); 
if (!cap.isOpened()) 
    return -1; 

cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); 

cv::namedWindow("Current Capture"); 
for (;;) 
{ 
    cv::Mat frame; 
    cap >> frame;  
    cv::Mat mirrored; 
    cv::flip(frame, mirrored, 1); 
    cv::imshow("Current Capture", process_image(mirrored)); 

    if (cv::waitKey(30) >= 0) break; 
} 

I가 가지고있는 문제를, 이미지의 원 검출 perfomes process_image이의 슬라이드 쇼 오히려으로 표시 완료하는 데 시간이 필요하고 원인이 있음 다음 비디오.

내 질문은 : process_image 조작 기능없이 처리 속도를 어떻게 높일 수 있습니까?

다른 스레드에서 이미지 처리를 수행하는 것에 대해 생각했지만 시작하는 방법을 잘 모르겠습니다. 이것보다 다른 아이디어가 있습니까?

PS : 나는 당신이 나를 위해 코드를 작성하는 기대 아니에요, 난 단지에서 시작하는 지점이 필요합니다;

) 편집 : 내가 할 수있는 일은이없는 경우,

확인 캡처하는 동안 성능에 관해서는 process_image 기능을 변경해야합니다.

cv::Mat process_image(cv::Mat img) 
{ 
    cv::Mat hsv; 
    cv::medianBlur(img, img, 7); 
    cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV); 

    cv::Mat lower_hue_range; // lower and upper hue range in case of red color 
    cv::Mat upper_hue_range; 
    cv::inRange(hsv, cv::Scalar(LOWER_HUE1, 100, 100), cv::Scalar(UPPER_HUE1, 255, 255), lower_hue_range); 
    cv::inRange(hsv, cv::Scalar(LOWER_HUE2, 100, 100), cv::Scalar(UPPER_HUE1, 255, 255), upper_hue_range); 

    /// Combine the above two images 
    cv::Mat hue_image; 
    cv::addWeighted(lower_hue_range, 1.0, upper_hue_range, 1.0, 0.0, hue_image); 

    /// Reduce the noise so we avoid false circle detection 
    cv::GaussianBlur(hue_image, hue_image, cv::Size(13, 13), 2, 2); 

    /// store all found circles here 
    std::vector<cv::Vec3f> circles; 
    cv::HoughCircles(hue_image, circles, CV_HOUGH_GRADIENT, 1, hue_image.rows/8, 100, 20, 0, 0); 

    for (size_t i = 0; i < circles.size(); i++) 
    { 
     /// circle center 
     cv::circle(hsv, cv::Point(circles[i][0], circles[i][1]), 3, cv::Scalar(0, 255, 0), -1, 8, 0); 
     /// circle outline 
     cv::circle(hsv, cv::Point(circles[i][0], circles[i][1]), circles[i][2], cv::Scalar(0, 0, 255), 3, 8, 0); 
    } 

    cv::Mat newI; 
    cv::cvtColor(hsv, newI, cv::COLOR_HSV2BGR); 

    return newI; 
} 

내가 할 수있는 거대한 성능 문제가 있습니까?

+0

1ms는 매우 짧습니다. 놀라운 성능 문제가 있습니다. –

+0

오, 죄송합니다. 이것은 제가 시도한 것입니다. 나는 원래 30ms로 그것을 시도했다. 질문을 수정했습니다. – muXXmit2X

답변

1

process_image 함수가 프로그램에서 병 목을 일으키는 것이지만 프로세스를 수정할 수 없다고 확신하면 할 수있는 일이 많지 않습니다. 이 함수가 비디오 프레임의 지속 시간보다 실행하는 데 시간이 오래 걸리면 필요한 것을 얻지 못할 것입니다.

비디오 캡처 품질을 줄이거 나 크기를 줄이는 방법은 어떻습니까? 지금은 1280 * 720으로 설정되어있는 것을 볼 수 있습니다. process_image 함수가 작업 할 데이터가 적 으면 더 빨리 실행해야합니다.

+0

흠. 좋아,이게 실제로 내가 생각한 것인데 ... 해상도를 낮추는 것은 결과적으로 품질을 떨어 뜨린다. 나는'process_image'의 코드에 접근하려고 노력할 것입니다. 어쩌면 최적화 될 수 있습니다. – muXXmit2X

관련 문제