例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;
}