學習OpenCV-例程實踐(持續更新)

 例4-1:用鼠標在窗口中畫方形的程序

#include"pch.h"//看情況加
#include <cv.h>
#include <highgui.h>

CvRect box;	//定義繪製的矩形
bool drawing_box = false;	//狀態-鼠標正在移動

void draw_box(IplImage* img, CvRect rect){
	//繪製矩形
	cvRectangle(
	img, cvPoint(rect.x, rect.y), cvPoint(rect.x+ rect.width, rect.y+ rect.height),
	cvScalar(0xff,0xf0,0x0f));
}

//鼠標響應函數-回調函數
void my_mouse_callback(
	int event, int x, int y, int flags, void* param)
{
	IplImage* img = (IplImage*)param;

	switch (event)
	{
	case CV_EVENT_MOUSEMOVE: 	//mouse move 
		if (drawing_box) {
			box.width = x - box.x;
			box.height = y - box.y;
		}

		break;
	case CV_EVENT_LBUTTONDOWN: 	//left button be pressed
		drawing_box = true;		//drawing flag set 1
		box = cvRect(x, y, 0, 0);

		break;
	case CV_EVENT_LBUTTONUP: 	//left button be released
		drawing_box = false;
		// redefine the left position of box
		if (box.width < 0) {
			box.x += box.width;
			box.width *= -1;
		}
		if (box.height < 0) {
			box.y += box.height;
			box.height *= -1;
		}
		draw_box(img, box);	// draw the box ,the img is a inside var

		break;
	}
}



int main(int argc, char** argv[])
{
	box = cvRect(-1, -1, 0, 0);//設置一個矩形,被隱藏

	IplImage *img = cvCreateImage(cvSize(2000, 2000), IPL_DEPTH_8U, 3);//創建一個圖像
	cvZero(img);//數據設置爲0
	IplImage* temp = cvCloneImage(img);	//copy image,copy the struction
	cvNamedWindow("Box Example");	//build a windown with box example
	
	//set mouse callback function 
	cvSetMouseCallback(
		"Box Example",
		my_mouse_callback,//the second para. only need pointer address 
		(void*)img);
	
	while (1){
		cvCopy(img, temp);//copy image from imag to temp
		if (drawing_box)	
			draw_box(temp, box);
		cvShowImage("Box Example", temp);
		
		if (cvWaitKey(15) == 27) break;
	}
	cvReleaseImage( &img );
	cvReleaseImage( &temp );
	cvDestroyWindow("Box Example");
}

 練習4-1

//三張合成的位置出現錯誤。文字還是有點問題

#include"pch.h"
#include <cv.h>
#include <highgui.h>

int main(int argc, char** argv)
{
	//加載視頻文件
	CvCapture* capture = cvCreateFileCapture("D:\\Project Files\\VS\\opencv\\ConsoleApplication1\\test.avi");
	//創建窗口
	cvNamedWindow("origin", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("gray", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("canny", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("totle", CV_WINDOW_AUTOSIZE);

	//獲取視頻的大小
	CvSize size = cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
		(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));
	
	//創建圖像結構-用於存放圖像信息
	IplImage* gray = cvCreateImage(size, IPL_DEPTH_8U, 1);
	IplImage* gray3 = cvCreateImage(size, IPL_DEPTH_8U, 3);		//三通道灰度圖像
	IplImage* cannyImage = cvCreateImage(size, IPL_DEPTH_8U, 1);
	IplImage* cannyImage3 = cvCreateImage(size, IPL_DEPTH_8U, 3);//三通道canny圖像
	//size.width = size.width*3;
	IplImage* totle = cvCreateImage(cvSize(size.width * 3, size.height), IPL_DEPTH_8U, 3);
	cvZero(totle);

	while (1)
	{
		IplImage* frame = cvQueryFrame(capture);

		if (!frame)
		{
			return -1;
		}

		cvShowImage("origin", frame);
		//轉化爲gray格式-灰度值
		cvConvertImage(frame, gray, 0);

		cvShowImage("gray", gray);

		//做canny運算
		//邊緣操作必須是單通道-灰度值
		if (gray->nChannels != 1)
		{
			break;
		}
		cvCanny(gray, cannyImage, 100, 150, 3);

		cvShowImage("canny", cannyImage);

		//將三個圖放在一個窗口中--利用指針頭
		IplImage* img1 = cvCreateImageHeader(size, frame->depth, 3);
		IplImage* img2 = cvCreateImageHeader(size, frame->depth, 3);
		IplImage* img3 = cvCreateImageHeader(size, frame->depth, 3);
		img1->origin = frame->origin;
		img1->widthStep = totle->widthStep;//這裏注意,因爲img1要成爲在大圖中的一部分,所以是大圖每行字節長


		img2->origin = frame->origin;
		img2->widthStep = totle->widthStep;

		img3->origin = frame->origin;
		img3->widthStep = totle->widthStep;

		//轉化爲三通道圖像
		cvCvtColor(gray, gray3, CV_GRAY2BGR);
		cvCvtColor(cannyImage, cannyImage3, CV_GRAY2BGR);


		img1->imageData = totle->imageData; //第一個指向大圖的開始處,即第一行
		cvCopy(frame, img1);

		img2->imageData = totle->imageData + frame->widthStep;//這裏很關鍵,注意字節排列問題,所以不能用width
		cvCopy(gray3, img2);

		img3->imageData = totle->imageData + 2 * frame->widthStep;
		cvCopy(cannyImage3, img3);


		CvFont font = cvFont(10.0, 1);
		cvInitFont(&font, CV_FONT_HERSHEY_SCRIPT_SIMPLEX, 0.5f, 0.5f, 0, 1);
		cvPutText(totle, "Frame", cvPoint(10, 20), &font, cvScalar(0, 0, 255));
		cvPutText(totle, "Frame_gray", cvPoint(10 + size.width, 20), &font, cvScalar(0, 0, 255));
		cvPutText(totle, "Frame_canny", cvPoint(10 + size.width * 2, 20), &font, cvScalar(0, 0, 255));

		cvShowImage("totle", totle);
		char c = cvWaitKey(33);
		if (c == 27)
		{
			break;
		}
	}

	cvReleaseCapture(&capture);
	cvReleaseImage(&gray);
	//cvReleaseImage(&gray);
	cvReleaseImage(&cannyImage);
	cvReleaseImage(&totle);
	cvReleaseImage(&gray3);
	cvReleaseImage(&cannyImage3);
	cvDestroyAllWindows();

	return 1;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章