《学习OpenCV》 - OpenCV入门(二)

目录

2-1:显示图片 

2-2:播放AVI视频

2-3:视频滚动条(测试未发现)

2-4:简单变换

2-5:尺寸变换

2-6:边缘检测

2-7/2-8:多样操作

2-9:摄像机读入数据


2-1:显示图片 

//显示图像

#include "pch.h"
#include <iostream>
#include"highgui.h"
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char **argv)
{
    //argv[1]传入的图片设置:【项目】-【属性】-【调试】-【命令参数】-输入文件(图像)路径
	IplImage* img = cvLoadImage("C:\\Users\\MR_Z\\Desktop\\1.jpg");    //图像文件加载到内存
    
    //屏幕创建窗口,(窗口标题,窗口属性)
	cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);    //根据实际大小进行拉伸或缩放

    //显示图片(窗口名,图片指针)
	cvShowImage("Example1", img);   

    //程序暂停,等待用户触发案件(时间)毫秒单位
	cvWaitKey(0);

    //释放图像分配的内存(图像地址)
	cvReleaseImage(&img);

    //销毁窗口,释放内存(窗口标题)
	cvDestroyWindow("Example1");

}

2-2:播放AVI视频

//播放AVI视频

#include "pch.h"
#include <iostream>
#include"highgui.h"
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char **argv)
{

	//屏幕创建窗口,(窗口标题,窗口属性)
	cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);    //根据实际大小进行拉伸或缩放

	//读入AVI文件
	CvCapture* capture = cvCreateFileCapture("C:\\Users\\MR_Z\\Desktop\\1.avi");

	IplImage* frame;
	while (1)
	{
		//在cvCapture 分配内存,获取capture的帧图像
		frame = cvQueryFrame(capture);
		//播放结束
		if (!frame)  break;

		//显示图片(窗口名,图片指针)
		cvShowImage("Example2", frame);

		//按键得到esc=27,结束
		char c = cvWaitKey(33);
		if (c == 27) break;
	}
	//释放内存空间
	cvReleaseCapture(&capture);

	//销毁窗口,释放内存(窗口标题)
	cvDestroyWindow("Example2");
}

2-3:视频滚动条(测试未发现)

//播放AVI视频
#include"cv.h"
#include "pch.h"
#include <iostream>
#include"highgui.h"
#include <opencv2/opencv.hpp>
using namespace cv;
int g_slider_positon = 0;
CvCapture* g_capture = NULL;

void onTrackbarSlide(int pos)
{
	cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
}

int main(int argc, char **argv)
{
	cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE); //创建窗口
	g_capture = cvCreateFileCapture("C:\\Users\\MR_Z\\Desktop\\1.avi");//获取avi文件
	int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);//以帧数的形式来读取图像
	if (frames != 0)
	{
		cvCreateTrackbar("Position", "Examples3", &g_slider_positon, frames, onTrackbarSlide);
	}


	IplImage* frame;
	while (1)
	{
		frame = cvQueryFrame(g_capture);
		if (!frame)  break;

		cvShowImage("Example3", frame);

		char c = cvWaitKey(33);
		if (c == 27) break;
	}

	cvReleaseCapture(&g_capture);
	cvDestroyWindow("Example3");
	return 0;

}

2-4:简单变换

/*
 *   1.建窗口                     cvNamedWindow(窗口标题,大小设置);
 *   2.显示原始图像               cvShowImage(窗口标题, 图像指针);
 *   3.处理图像                  cvSmooth(image, out, CV_GAUSSIAN, 5, 5);
 *   4.显示处理图像
 *   5.释放图像、释放窗口        cvReleaseImage(图像地址);cvDestroyWindow(窗口标题);
 */

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

#include <opencv2/opencv.hpp>
using namespace cv;

void example2_4(IplImage* image)
{

	//创建两个窗口
	cvNamedWindow("Example2_4-in", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("Example2_4-out", CV_WINDOW_AUTOSIZE);

	//显示图像
	cvShowImage("Example2_4-in", image);

	// Create an image to hold the smoothed output
	//创建一个用来存储的图像(cvSize结构体的大小,像素点的数据类型,通道数(RGB))
	IplImage* out = cvCreateImage(cvGetSize(image),	IPL_DEPTH_8U, 3);

	////平滑操作(输入图像,输出图像,平滑方法,高斯卷积*2)
	cvSmooth(image, out, CV_GAUSSIAN, 5, 5);

	//显示处理后图像
	cvShowImage("Example2_4-out", out);

	// 释放图像内存
	cvReleaseImage(&out);

	//等待键入退出
	cvWaitKey(0);
    //释放窗口内存
	cvDestroyWindow("Example2_4-in");
	cvDestroyWindow("Example2_4-out");

}

int main(int argc, char** argv)
{
    //读取图像
	IplImage* img = cvLoadImage("C:\\Users\\MR_Z\\Desktop\\1.jpg");
	example2_4(img);
}

2-5:尺寸变换

IplImage* doPyrDown(IplImage* in, int filter = IPL_GAUSSIAN_5x5)
{
    assert(in->width % 2 == 0 && in->height % 2 == 0);
    IplImage* out =cvCreatImage(cvSize(in->width / 2,in->height / 2), in->depth, in->nChannels);
    /**********************************/
    cvPryDown(in, out);        //尺寸变化命令
    /**********************************/
    return out;
}

2-6:边缘检测

IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture)
{
    if(in->cvChannels != 1) return 0;//不是单通道返回
    IplImage* out = cvCreateImage(cvSize(cvGetSize(in)), IPL_DEPTH_8U,1);

    /**********************************/
    cvCanny(in, out, lowThresh, highThresh, aperture);
    /**********************************/

    return out;
};

2-7/2-8:多样操作

IplImage* out;
out = doPyrDown(in, IPL_GAUSSIAN_5x5);    //缩放操作
out = doPyrDown(out, IPL_GAUSSIAN_5x5);
out = doCanny(out, 10, 100,3);            //边缘检测

cvReleaseImage(&out);

2-9:摄像机读入数据


#include "cv.h"
#include "highgui.h"
#include "pch.h"
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv) {
	cvNamedWindow("Example2_9", CV_WINDOW_AUTOSIZE);
	CvCapture* capture;
	if (argc == 1) {
		capture = cvCreateCameraCapture(0);	//捕获摄像头图像内容
	}
	else {
		capture = cvCreateFileCapture("C:\\Users\\MR_Z\\Desktop\\vtest.avi");//视频文件
	}
	assert(capture != NULL);//用于调试

	IplImage* frame;
	while (1) {
		frame = cvQueryFrame(capture);
		if (!frame) break;
		cvShowImage("Example2_9", frame);
		char c = cvWaitKey(10);
		if (c == 27) break;
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("Example2_9");
}

2-10写入AVI视频文件


#include "cv.h"
#include "highgui.h"
#include "pch.h"
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char* argv[])
{
	CvCapture* capture = 0;
	capture = cvCreateFileCapture(argv[1]);
	if (!capture)	//没有视频文件则返回
	{
		return -1;
	}
	IplImage* bgr_frame = cvQueryFrame(capture);

	double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);//获取帧率

	CvSize size = cvSize(
		(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
		(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));//获取图像的大小

	//写视频流(写入视频文件标题,视频压缩格式,帧率,图像大小)
	CvVideoWriter* writer = cvCreateVideoWriter(
		argv[2],
		CV_FOURCC('M', 'J', 'P', 'G'),//用来指示编码格式(4个字符)
		fps,
		size);
	//新建一个对数极坐标图像
	IplImage* logpolar_frame = cvCreateImage(
		size,
		IPL_DEPTH_8U,
		3
	);
	//
	while ((bgr_frame = cvQueryFrame(capture)) != NULL) {
		//(源图像,目标图像,变化前图像中心的二维坐标,变化尺度参数,插值方法)
		cvLogPolar(bgr_frame, logpolar_frame,
			cvPoint2D32f(bgr_frame->width / 2,
				bgr_frame->height / 2),
			40,
			CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS);//*****************
		cvWriteFrame(writer, logpolar_frame);
	}
	cvReleaseVideoWriter(&writer);
	cvReleaseImage(&logpolar_frame);
	cvReleaseCapture(&capture);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiyangsu2617/article/details/83304702