C++primer学习及OPENCV总结

本文介绍了使用OpenCV进行图像处理的一些基本操作,包括创建图像、图像格式转换、图像扩增及复制、绘制直线、寻找物体的凸包等关键步骤,并通过实例展示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

申明:本篇博文主要是用来督促博主自己的学习,所以博友们如果有什么问题,你可以问,但是博主不一定会回答!

2016-12-4~2016-12-11

opencv基本数据结构网站

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html?highlight=rotatedrect


知识点1:创建Mat图像

Mat dstImage = createImage(getSize(srcImage), 8, 1);


知识点2:Mat与IplImage相互转换

IplImage->Mat

IplImage*dst3;

Mat dst4=dst3;

Mat->IplImage

Mat img;

IplImage*src;

src=&IplImage(img);


知识点3:将Mat srcgujia 图片扩大,然后进行复制

        //对图像进行扩充
Mat midgujia = cvCreateImage(Size(srcgujia.cols+100,srcgujia.rows+100), 8, 1);
IplImage*mid;
mid = &IplImage(midgujia);
cvZero(mid);

for (int i = 0; i<srcgujia.rows; i++)
{
/* uchar*data=srcgujia.ptr<uchar>(i);
uchar*data1 = midgujia.ptr<uchar>(i + 50);*/
for (int j = 0; j<srcgujia.cols; j++)
{
uchar*data = srcgujia.ptr<uchar>(i, j);
uchar*data1 = midgujia.ptr<uchar>(i + 50, j + 50);
*data1++ = *data++;//只能使用指针++,而不能使用data1[i,j]=data[i,j]   原因不明确
}
}

复制的结果图


知识点4

cvLine( CvArr* img,

        CvPoint pt1, 

                      CvPoint pt2, 

      CvScalar color,

             int thickness=1, 

     int line_type=8, 

                     int shift=0 );

第一个参数img:要划的线所在的图像;

第二个参数pt1:直线起点

第二个参数pt2:直线终点

第三个参数color:直线的颜色 e.g:Scalor(0,0,255)

第四个参数thickness=1:线条粗细

第五个参数line_type=8, 

   8 (or 0) - 8-connected line(8邻接)连接 线。
   4 - 4-connected line(4邻接)连接线。

   CV_AA - antialiased 线条。

第六个参数:坐标点的小数点位数。


知识点5:需找物体的凸包

vector<Point>points;
Point point;
for (int i = 0; i < midgujia.rows; i++)
{
uchar*data2 = midgujia.ptr<uchar>(i);
for (int j = 0; j < midgujia.cols; j++)
{
if (data2[j] == 255)
{
point.x = j;
point.y = i;
points.push_back(point);
}
}
}


RotatedRect box = minAreaRect(points);
Point2f vertex[4];
box.points(vertex);
for (int i = 0; i < 4; i++)
line(midgujia, vertex[i], vertex[(i + 1) % 4], Scalar(255, 255, 255), 1,8);
imshow("矩形包围后", midgujia);
waitKey(0);

//问题  :若minAreaRect的参数不是点就会出现错误




知识点6









<think>好的,我现在需要帮用户介绍一下C++学习。首先,用户可能是个编程新手,或者有一定编程基础想转学C++。我需要考虑从哪些方面入手,既要全面又不能让信息过载。 首先,C++的特点和应用领域。得提到它作为静态类型、编译型、支持多范式的语言,强调性能和控制,适合系统级开发,比如操作系统、游戏引擎、嵌入式系统这些。这部分要简明扼要,让用户知道为什么选择C++。 接下来是学习路径。得分为几个阶段,比如基础语法、核心特性、标准库、高级主题等。每个阶段需要列出关键点,比如基础语法里的变量、循环、函数;核心特性中的OOP、模板、RAII;标准库的容器、算法、智能指针等。这部分要结构清晰,逐步深入,帮助用户建立学习框架。 然后是学习资源推荐。书籍方面,《C++ Primer》和《Effective C++》是经典,还有STL源码剖析之类的。在线资源如C++官方文档、CppReference、Stack Overflow这些社区。项目实践的话,可以从控制台小项目开始,逐步到复杂系统,比如游戏、网络应用。这里需要确保推荐的资源权威且实用。 常见误区也要提一下,避免用户走弯路。比如过度关注语法细节而忽视设计,或者滥用高级特性导致代码复杂。强调理解底层原理的重要性,比如内存管理、编译器行为。 最后是学习建议,分阶段学习,理论与实践结合,参与开源项目,关注新标准。这部分要鼓励用户持续实践,保持学习热情。 需要注意用户可能对某些术语不熟悉,比如RAII、STL,所以在解释时要尽量用易懂的语言。同时,避免使用过于专业的术语,或者在必要时简单解释。比如提到RAII时,可以稍微说明一下它是资源获取即初始化的概念,用于管理资源生命周期。 还要检查是否符合系统级指令,比如数学公式是否正确用$包裹,独立公式用$$,但C++介绍中可能数学公式不多,但如果有的话要处理。比如在提到算法复杂度时可能会有O(n),这时候需要用$O(n)$。但用户的问题可能不涉及太多数学,所以可能不需要太多处理。 另外,结构要清晰,分点列出,用标题和子标题帮助阅读。使用中文,保持口语化,但不过于随意。确保每个部分的信息准确,比如书籍的作者和内容是否正确,避免错误推荐。 最后总结一下,整个思考过程要围绕用户需求,提供系统而实用的学习指南,帮助他们建立正确的学习路径,避免常见错误,并推荐优质资源。同时保持回答的条理和可读性,让用户能一步步跟随学习。</think>### C++ 学习指南 C++ 是一种高效、灵活的编程语言,广泛应用于系统开发、游戏引擎、嵌入式系统和高性能计算等领域。以下是系统化的学习路径和建议: --- #### 一、C++ 核心特点 1. **多范式支持** - 支持面向过程、面向对象(OOP)、泛型编程(模板)和函数式编程。 - 例如:用类实现封装与继承: ```cpp class Animal { public: virtual void speak() = 0; // 纯虚函数 }; class Dog : public Animal { public: void speak() override { cout << "Woof!" << endl; } }; ``` 2. **底层控制能力** - 直接操作内存(指针、引用)、手动管理资源(如 `new`/`delete`)。 - 需注意**内存泄漏**和**悬垂指针**问题。 3. **高性能** - 编译型语言,通过编译器优化生成高效机器码。 - 支持内联汇编、SIMD 指令等底层优化手段。 --- #### 二、学习路径分阶段 **阶段 1:基础语法** 1. 数据类型、变量、运算符(如 `int`, `double`, `const`)。 2. 流程控制:`if-else`、`for`、`while`、`switch`。 3. 函数:参数传递(值传递 vs 引用传递)、重载、递归。 **阶段 2:核心机制** 1. **面向对象**:类与对象、继承、多态、虚函数表原理。 2. **模板编程**:函数模板与类模板,例如: ```cpp template <typename T> T max(T a, T b) { return (a > b) ? a : b; } ``` 3. **RAII(资源获取即初始化)**:通过构造函数/析构函数自动管理资源(如 `std::unique_ptr`)。 **阶段 3:标准库(STL)** 1. **容器**:`vector`, `map`, `unordered_set`。 2. **算法**:`sort`, `find`, 迭代器。 3. **智能指针**:`unique_ptr`, `shared_ptr`, `weak_ptr`。 **阶段 4:高级主题** 1. 移动语义(`std::move`)、完美转发(`std::forward`)。 2. 多线程与并发(`std::thread`, `std::mutex`)。 3. 元编程(C++11/14/17/20 新特性,如 `constexpr`、概念约束)。 --- #### 三、学习资源推荐 1. **书籍** - 入门:《C++ Primer》(第5版) - 进阶:《Effective C++》《More Effective C++》 - 底层原理:《深度探索C++对象模型》 2. **在线资源** - [C++官方文档](https://isocpp.org/) - [CppReference](https://en.cppreference.com/) - 社区:Stack Overflow、Reddit/r/cpp 3. **实践项目** - 初级:实现命令行计算器、文本处理工具。 - 中级:小型游戏引擎、网络通信库。 - 高级:参与开源项目(如 [OpenCV](https://github.com/opencv/opencv))。 --- #### 四、常见误区与建议 1. **避免过早优化** - 先保证代码正确性,再考虑性能优化。 2. **慎用“现代特性”** - 如 Lambda 表达式和模板元编程虽强大,但需权衡可读性。 3. **重视调试工具** - 掌握 GDB/LLDB 调试器,Valgrind 内存检测工具。 --- #### 五、总结 C++ 学习曲线陡峭,但深入掌握后能解决高性能场景的核心问题。建议: 1. 分阶段学习,夯实基础后再攻高级特性。 2. 多写代码,通过调试理解底层机制。 3. 关注 C++ 标准演进(如 C++20 的协程和模块)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值