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

爱被打了一巴掌 2022-05-11 18:03 473阅读 0赞

目录

2-1:显示图片

2-2:播放AVI视频

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

2-4:简单变换

2-5:尺寸变换

2-6:边缘检测

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

2-9:摄像机读入数据


2-1:显示图片

  1. //显示图像
  2. #include "pch.h"
  3. #include <iostream>
  4. #include"highgui.h"
  5. #include <opencv2/opencv.hpp>
  6. using namespace cv;
  7. int main(int argc, char **argv)
  8. {
  9. //argv[1]传入的图片设置:【项目】-【属性】-【调试】-【命令参数】-输入文件(图像)路径
  10. IplImage* img = cvLoadImage("C:\\Users\\MR_Z\\Desktop\\1.jpg"); //图像文件加载到内存
  11. //屏幕创建窗口,(窗口标题,窗口属性)
  12. cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE); //根据实际大小进行拉伸或缩放
  13. //显示图片(窗口名,图片指针)
  14. cvShowImage("Example1", img);
  15. //程序暂停,等待用户触发案件(时间)毫秒单位
  16. cvWaitKey(0);
  17. //释放图像分配的内存(图像地址)
  18. cvReleaseImage(&img);
  19. //销毁窗口,释放内存(窗口标题)
  20. cvDestroyWindow("Example1");
  21. }

2-2:播放AVI视频

  1. //播放AVI视频
  2. #include "pch.h"
  3. #include <iostream>
  4. #include"highgui.h"
  5. #include <opencv2/opencv.hpp>
  6. using namespace cv;
  7. int main(int argc, char **argv)
  8. {
  9. //屏幕创建窗口,(窗口标题,窗口属性)
  10. cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE); //根据实际大小进行拉伸或缩放
  11. //读入AVI文件
  12. CvCapture* capture = cvCreateFileCapture("C:\\Users\\MR_Z\\Desktop\\1.avi");
  13. IplImage* frame;
  14. while (1)
  15. {
  16. //在cvCapture 分配内存,获取capture的帧图像
  17. frame = cvQueryFrame(capture);
  18. //播放结束
  19. if (!frame) break;
  20. //显示图片(窗口名,图片指针)
  21. cvShowImage("Example2", frame);
  22. //按键得到esc=27,结束
  23. char c = cvWaitKey(33);
  24. if (c == 27) break;
  25. }
  26. //释放内存空间
  27. cvReleaseCapture(&capture);
  28. //销毁窗口,释放内存(窗口标题)
  29. cvDestroyWindow("Example2");
  30. }

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

  1. //播放AVI视频
  2. #include"cv.h"
  3. #include "pch.h"
  4. #include <iostream>
  5. #include"highgui.h"
  6. #include <opencv2/opencv.hpp>
  7. using namespace cv;
  8. int g_slider_positon = 0;
  9. CvCapture* g_capture = NULL;
  10. void onTrackbarSlide(int pos)
  11. {
  12. cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
  13. }
  14. int main(int argc, char **argv)
  15. {
  16. cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE); //创建窗口
  17. g_capture = cvCreateFileCapture("C:\\Users\\MR_Z\\Desktop\\1.avi");//获取avi文件
  18. int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);//以帧数的形式来读取图像
  19. if (frames != 0)
  20. {
  21. cvCreateTrackbar("Position", "Examples3", &g_slider_positon, frames, onTrackbarSlide);
  22. }
  23. IplImage* frame;
  24. while (1)
  25. {
  26. frame = cvQueryFrame(g_capture);
  27. if (!frame) break;
  28. cvShowImage("Example3", frame);
  29. char c = cvWaitKey(33);
  30. if (c == 27) break;
  31. }
  32. cvReleaseCapture(&g_capture);
  33. cvDestroyWindow("Example3");
  34. return 0;
  35. }

2-4:简单变换

  1. /*
  2. * 1.建窗口 cvNamedWindow(窗口标题,大小设置);
  3. * 2.显示原始图像 cvShowImage(窗口标题, 图像指针);
  4. * 3.处理图像 cvSmooth(image, out, CV_GAUSSIAN, 5, 5);
  5. * 4.显示处理图像
  6. * 5.释放图像、释放窗口 cvReleaseImage(图像地址);cvDestroyWindow(窗口标题);
  7. */
  8. #include "cv.h"
  9. #include "highgui.h"
  10. #include "pch.h"
  11. #include <opencv2/opencv.hpp>
  12. using namespace cv;
  13. void example2_4(IplImage* image)
  14. {
  15. //创建两个窗口
  16. cvNamedWindow("Example2_4-in", CV_WINDOW_AUTOSIZE);
  17. cvNamedWindow("Example2_4-out", CV_WINDOW_AUTOSIZE);
  18. //显示图像
  19. cvShowImage("Example2_4-in", image);
  20. // Create an image to hold the smoothed output
  21. //创建一个用来存储的图像(cvSize结构体的大小,像素点的数据类型,通道数(RGB))
  22. IplImage* out = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
  23. 平滑操作(输入图像,输出图像,平滑方法,高斯卷积*2
  24. cvSmooth(image, out, CV_GAUSSIAN, 5, 5);
  25. //显示处理后图像
  26. cvShowImage("Example2_4-out", out);
  27. // 释放图像内存
  28. cvReleaseImage(&out);
  29. //等待键入退出
  30. cvWaitKey(0);
  31. //释放窗口内存
  32. cvDestroyWindow("Example2_4-in");
  33. cvDestroyWindow("Example2_4-out");
  34. }
  35. int main(int argc, char** argv)
  36. {
  37. //读取图像
  38. IplImage* img = cvLoadImage("C:\\Users\\MR_Z\\Desktop\\1.jpg");
  39. example2_4(img);
  40. }

2-5:尺寸变换

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

2-6:边缘检测

  1. IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture)
  2. {
  3. if(in->cvChannels != 1) return 0;//不是单通道返回
  4. IplImage* out = cvCreateImage(cvSize(cvGetSize(in)), IPL_DEPTH_8U,1);
  5. /**********************************/
  6. cvCanny(in, out, lowThresh, highThresh, aperture);
  7. /**********************************/
  8. return out;
  9. };

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

  1. IplImage* out;
  2. out = doPyrDown(in, IPL_GAUSSIAN_5x5); //缩放操作
  3. out = doPyrDown(out, IPL_GAUSSIAN_5x5);
  4. out = doCanny(out, 10, 100,3); //边缘检测
  5. cvReleaseImage(&out);

2-9:摄像机读入数据

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "pch.h"
  4. #include <opencv2/opencv.hpp>
  5. using namespace cv;
  6. int main(int argc, char** argv) {
  7. cvNamedWindow("Example2_9", CV_WINDOW_AUTOSIZE);
  8. CvCapture* capture;
  9. if (argc == 1) {
  10. capture = cvCreateCameraCapture(0); //捕获摄像头图像内容
  11. }
  12. else {
  13. capture = cvCreateFileCapture("C:\\Users\\MR_Z\\Desktop\\vtest.avi");//视频文件
  14. }
  15. assert(capture != NULL);//用于调试
  16. IplImage* frame;
  17. while (1) {
  18. frame = cvQueryFrame(capture);
  19. if (!frame) break;
  20. cvShowImage("Example2_9", frame);
  21. char c = cvWaitKey(10);
  22. if (c == 27) break;
  23. }
  24. cvReleaseCapture(&capture);
  25. cvDestroyWindow("Example2_9");
  26. }

2-10写入AVI视频文件

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "pch.h"
  4. #include <opencv2/opencv.hpp>
  5. using namespace cv;
  6. int main(int argc, char* argv[])
  7. {
  8. CvCapture* capture = 0;
  9. capture = cvCreateFileCapture(argv[1]);
  10. if (!capture) //没有视频文件则返回
  11. {
  12. return -1;
  13. }
  14. IplImage* bgr_frame = cvQueryFrame(capture);
  15. double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);//获取帧率
  16. CvSize size = cvSize(
  17. (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
  18. (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));//获取图像的大小
  19. //写视频流(写入视频文件标题,视频压缩格式,帧率,图像大小)
  20. CvVideoWriter* writer = cvCreateVideoWriter(
  21. argv[2],
  22. CV_FOURCC('M', 'J', 'P', 'G'),//用来指示编码格式(4个字符)
  23. fps,
  24. size);
  25. //新建一个对数极坐标图像
  26. IplImage* logpolar_frame = cvCreateImage(
  27. size,
  28. IPL_DEPTH_8U,
  29. 3
  30. );
  31. //
  32. while ((bgr_frame = cvQueryFrame(capture)) != NULL) {
  33. //(源图像,目标图像,变化前图像中心的二维坐标,变化尺度参数,插值方法)
  34. cvLogPolar(bgr_frame, logpolar_frame,
  35. cvPoint2D32f(bgr_frame->width / 2,
  36. bgr_frame->height / 2),
  37. 40,
  38. CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS);//*****************
  39. cvWriteFrame(writer, logpolar_frame);
  40. }
  41. cvReleaseVideoWriter(&writer);
  42. cvReleaseImage(&logpolar_frame);
  43. cvReleaseCapture(&capture);
  44. return 0;
  45. }

发表评论

表情:
评论列表 (有 0 条评论,473人围观)

还没有评论,来说两句吧...

相关阅读