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,则可以很好地检测到它,但不存储它。