为什么不存储opencv边缘检测到的视频?

时间:2018-06-21 08:55:08

标签: c++ opencv

using namespace cv;
using namespace std;

int myFontFace = 5;

int cnt = 0;

Mat img;
Mat OutputImg;
void Canny_edge()
{
   Mat src_gray;
   Mat dst;
   cvtColor(img, src_gray, CV_BGR2GRAY);
   blur(src_gray, dst, Size(5, 5));
   Canny(dst, OutputImg, 50, 100, 3);
   putText(OutputImg, "Canny_edge", Point(10, 30), myFontFace, 1.2, Scalar(255, 
   255, 255));
}

void soble_edge()
{
Mat src_gray;
Mat dst;
Mat sobelX, sobelY;
cvtColor(img, src_gray, CV_BGR2GRAY);
Sobel(src_gray, sobelX, CV_8U, 1, 0);
Sobel(src_gray, sobelY, CV_8U, 0, 1);
OutputImg = abs(sobelX) + abs(sobelY);
putText(OutputImg, "soble_edge", Point(10, 30), myFontFace, 1.2, Scalar(255, 255, 255));
}


int main() {

VideoCapture vc("move.mp4");
if (!vc.isOpened())
{
    cout << "I Can't Open Video" << endl;
    return 1;
}

Size size = Size((int)vc.get(CAP_PROP_FRAME_WIDTH),
    (int)vc.get(CAP_PROP_FRAME_HEIGHT));
vc.set(CAP_PROP_FPS, 30.0);

VideoWriter Outvideo;

Outvideo.open("ouput.avi", VideoWriter::fourcc('X', 'V', 'I', 'D'), 30, size, true);


while (1)
{

    vc >> img;
    if (img.empty()) break;
    int fps = vc.get(CAP_PROP_FPS);
    int wait = int(1.0 / fps * 1000);
    cnt++;
    const int num = cnt / 550;

    if(num <= 1)
        Canny_edge();
    else if(num ==2)
        soble_edge();
    else if(num ==3)
        Eroded();
    else if (num == 4)
        dilate();
    else if (num == 5)
        GammaCorrection(img, OutputImg, 0.1);
    else if (num == 6)
        Gaussian_Blur();
    else if (num == 7)
        Threshold();
    else if (num == 8)
        Opening();
    else if (num >= 9)
        Closeing();


    imshow("video", OutputImg);

    Outvideo << OutputImg;
    Outvideo.write(OutputImg);

    if (waitKey(wait) == 27) break; //ESC
}
//destroyAllWindows();
return 0;

}

仅边缘检测部分未存储以保存视频。

即使单独保存,也无法保存Sobel边缘和Canny边缘检测。我不知道为什么。

保存是否存在问题?

还是边缘检测有问题?

如果将边缘检测输出到imshow,则可以很好地检测到它,但不存储它。

0 个答案:

没有答案