目录
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;
}