標籤:des style blog http color os
2014-07-17
第四章 細說HighGUI
練習題第1題
題目大致要求:
a:(1)從視頻檔案讀入資料,(2)轉換為灰階圖,(3)做Canny邊緣檢測,顯示在三個視窗
b:將a的三個視頻顯示在一個視窗中
c:在b步驟的不同部分寫上合適的文字標籤
代碼:
1 #include "stdafx.h" 2 #include <windows.system.h> 3 #include <iostream> 4 #include <cv.h> 5 #include <highgui.h> 6 using namespace std; 7 using namespace cv; 8 9 int _tmain(int argc, _TCHAR* argv[]) 10 { 11 const char * videoFileName = "D:\\Work\\Work_Programming\\Source\\Video\\Fork.avi"; 12 13 cvNamedWindow("原始視頻", 0); 14 cvNamedWindow("灰階視頻", 0); 15 cvNamedWindow("Canny視頻", 0); 16 cvNamedWindow("三合一視頻", 0); 17 18 CvCapture * videoCapture = cvCreateFileCapture(videoFileName); 19 int imgWidth = (int)cvGetCaptureProperty(videoCapture, CV_CAP_PROP_FRAME_WIDTH); 20 int imgHeight = (int)cvGetCaptureProperty(videoCapture, CV_CAP_PROP_FRAME_HEIGHT); 21 IplImage * frame; 22 23 IplImage * grayImage = cvCreateImage(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 1); 24 IplImage * cannyImage = cvCreateImage(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 1); 25 IplImage * tripleImage = cvCreateImage(cvSize(imgWidth * 3, imgHeight), IPL_DEPTH_8U, 3); 26 IplImage *tempImage = cvCreateImage(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3); 27 28 IplImage *subFrameImage = cvCreateImageHeader(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3); 29 IplImage *subGrayImage = cvCreateImageHeader(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3); 30 IplImage *subCannyImage = cvCreateImageHeader(cvSize(imgWidth, imgHeight), IPL_DEPTH_8U, 3); 31 32 //--------------------c在圖片上顯示文字----------------------- 33 CvFont ft; 34 cvInitFont(&ft, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 2, 8); 35 36 while (true) 37 { 38 frame = cvQueryFrame(videoCapture); 39 40 if (!frame) 41 { 42 break; 43 } 44 45 //--------------------a(1)小題----------------------- 46 cvShowImage("原始視頻", frame); 47 48 //--------------------a(2)小題----------------------- 49 cvCvtColor(frame, grayImage, CV_BGR2GRAY); 50 cvShowImage("灰階視頻", grayImage); 51 52 //--------------------a(3)小題----------------------- 53 if (grayImage->nChannels != 1) 54 { 55 return 0; 56 } 57 58 cvCanny(grayImage, cannyImage, 50, 100, 3); 59 cvShowImage("Canny視頻", cannyImage); 60 61 //--------------------b:將三個視頻在一個視窗中顯式----------------------- 62 //將原始映像複製到三合一視窗 63 subFrameImage->origin = tripleImage->origin; 64 subFrameImage->widthStep = tripleImage->widthStep; 65 subFrameImage->imageData = tripleImage->imageData; 66 67 cvPutText(frame, "Original", cvPoint(0, 20), &ft, cvScalar(255, 255, 255)); 68 69 cvCopy(frame, subFrameImage); 70 71 //將灰階圖複製到三合一視窗 72 subGrayImage->origin = tripleImage->origin; 73 subGrayImage->widthStep = tripleImage->widthStep; 74 subGrayImage->imageData = tripleImage->imageData + (subFrameImage->width)*subFrameImage->nChannels; 75 cvCvtColor(grayImage, tempImage, CV_GRAY2BGR); 76 77 cvPutText(tempImage, "Gray", cvPoint(0, 20), &ft, cvScalar(255, 255, 255)); 78 79 cvCopy(tempImage, subGrayImage); 80 81 //將Canny複製到三合一視窗 82 subCannyImage->origin = tripleImage->origin; 83 subCannyImage->widthStep = tripleImage->widthStep; 84 subCannyImage->imageData = tripleImage->imageData + (subFrameImage->width * 2)*subFrameImage->nChannels; 85 cvCvtColor(cannyImage, tempImage, CV_GRAY2BGR); 86 87 cvPutText(tempImage, "Canny", cvPoint(0, 20), &ft, cvScalar(255, 255, 255)); 88 89 cvCopy(tempImage, subCannyImage); 90 91 cvShowImage("三合一視頻", tripleImage); 92 93 char c = cvWaitKey(33); 94 if (c == 27) 95 { 96 break; 97 } 98 } 99 100 cvReleaseImage(&grayImage);101 cvReleaseImage(&cannyImage);102 cvReleaseImage(&tripleImage);103 cvReleaseImage(&tempImage);104 105 cvReleaseImageHeader(&subFrameImage);106 cvReleaseImageHeader(&subGrayImage);107 cvReleaseImageHeader(&subCannyImage);108 cvReleaseCapture(&videoCapture);109 cvDestroyWindow("原始視頻");110 cvDestroyWindow("灰階視頻");111 cvDestroyWindow("Canny視頻");112 cvDestroyWindow("三合一視頻");113 114 //system("pause");115 116 return 0;117 }
結果映像: