OpenCV学习(7.16)

写了个实现摄像头上画线并输出角度的东西……虽然很简单,但脑残的我还是debug了很长时间。

 1 // 圆和直线.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 
 6 using namespace std;
 7 using namespace cv;
 8 
 9 void onMouse(int event, int x, int y, int flags, void* param);
10 
11 Mat frame;
12 Point p1, p2;
13 bool flag = true;
14 
15 int main()
16 {
17   VideoCapture capture;
18   capture.open(0);
19 
20   namedWindow("test", WINDOW_AUTOSIZE);
21   setMouseCallback("test", onMouse);
22 
23   while (1)
24   {
25     capture >> frame;
26     line(frame, p1, p2, 0, 1, 8, 0);
27     imshow("test", frame);
28     waitKey(33);
29   }
30   return 0;
31 }
32 
33 void onMouse(int event, int x, int y, int flags, void* param)
34 {
35 
36   switch (event)
37   {
38   case CV_EVENT_MOUSEMOVE:
39     if (flag == true) { p1.x = x; p1.y = y - 50; p2.x = x; p2.y = y + 50; }
40     else { p2.x = x; p2.y = y; }
41     break;
42   case CV_EVENT_LBUTTONDOWN:
43     flag = false; p1.x = x; p1.y = y; break;
44   case CV_EVENT_LBUTTONUP:
45     int X = x - p1.x, Y = p1.y - y;
46     double r = sqrt(fabs(X*X) + fabs(Y*Y));
47     //cout <<X << ' ' << Y << endl;
48     double e = 180.0 / 3.1415926, line_degree;
49     if (X > 0)
50     {
51       if (Y >= 0) line_degree = asin(Y / r)*e;
52       else line_degree = asin(Y / r)*e;
53     }
54     else if (X < 0)
55     {
56     if (Y >= 0) line_degree = 180-asin(Y / r)*e;
57     else line_degree = -asin(Y / r)*e - 180.0;
58     }
59   cout << "角度=" << line_degree << endl;
60   flag = true;
61   break;
62   }
63   return;
64 }

 

鼠标标识掩膜:
实现比较简单……就是新建一个图片,在那个图片中画圆,需要的时候用addweight函数把两张照片融合到一起,但是因为我掌握了直接画圆的技术所以就不需要这个了。

串口通信程序:
这个地方似乎要用到C#。在VS中写C#的话就需要在:
“属性管理器”->“配置属性”->“常规”->“公共语言运行时支持”中选择“公共语言运行时支持”。
但打开公共支持之后还是不行……
//
好的,要打开“属性管理器”,在“配置”处选择“所有配置”。


下面的代码是从Microsoft的官网上拿来的例程,但注释是我自己写得。主要原因是学长从网上找的是C#的例程,而我找的是C++程序。
写了一堆注释……定义了一些初始值。

// 串口通信C++.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#using <System.dll>//程序集using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;public ref class PortChat
{
private:
static bool _continue;
static SerialPort^ _serialPort;public:
static void Main()
{
String^ name;//“^”表示声明一个托管类型的字符串指针。特点是内存由GC管理,占用的内存会被自动释放
String^ message;
StringComparer^ stringComparer = StringComparer::OrdinalIgnoreCase;//表示一种字符串比较操作,该操作使用特定的大小写以及基于区域性的比较规则或序号比较规则。
Thread^ readThread = gcnew Thread(gcnew ThreadStart(PortChat::Read));//新建线程// Create a new SerialPort object with default settings.
_serialPort = gcnew SerialPort();// 设置各种数据
_serialPort->PortName = SetPortName("COM3");//设置通信湍口(这里可以用COM端口)
_serialPort->BaudRate = SetPortBaudRate(9600);//设置串行波特率
_serialPort->Parity = SetPortParity(Parity::None);//设置奇偶校验检查协议
_serialPort->DataBits = SetPortDataBits(8);//设置每个字节的标准数据位长度
_serialPort->StopBits = SetPortStopBits(StopBits::One);//设置标准停止位数
//_serialPort->Handshake = SetPortHandshake(_serialPort->Handshake);//设置串行端口数据传输的握手协议// Set the read/write timeouts
//_serialPort->ReadTimeout = 500;//设置读取操作未完成时发生超时之前的毫秒数
//_serialPort->WriteTimeout = 500;//设置写入操作未完成时发生超时之前的毫秒数

_serialPort->Open();//打开端口
_continue = true;//是否继续传输
//readThread->Start();//Console::Write("Name: ");//console即控制台。似乎这句话的意思是输出到控制台
name = Console::ReadLine();//一直读取到输入缓冲区中的 NewLine 值。
//SerialPort::NewLine 属性 
//获取或设置用于解释 ReadLine 和 WriteLine 方法调用结束的值。
//表示行尾的值,默认值为换行符。
//Console::WriteLine("Type QUIT to exit");while (_continue)
{
message = Console::ReadLine();if (stringComparer->Equals("quit", message))//如果是quit就退出(话说前面明明说的是大写……)
{
_continue = false;
}
else
{
_serialPort->WriteLine(//将指定的字符串和NewLine值写入输出缓冲区
String::Format("<{0}>: {1}", name, message));
//String::Format用来生成一个静态字符串
//此处生成的应该是:“<name>:message”
}
}readThread->Join();//令线程处于阻塞状态
_serialPort->Close();//关闭串口
}static void Read()
{
while (_continue)
{
try
{
String^ message = _serialPort->ReadLine();
Console::WriteLine(message);
}
catch (TimeoutException ^) {}//超时的话就算是发生了错误……是这个意思吧
}
}static String^ SetPortName(String^ defaultPortName)
{
String^ portName;Console::WriteLine("Available Ports:");
for each (String^ s in SerialPort::GetPortNames())
{
Console::WriteLine(" {0}", s);
}Console::Write("Enter COM port value (Default: {0}): ", defaultPortName);
portName = Console::ReadLine();if (portName == "")
{
portName = defaultPortName;
}
return portName;
}static Int32 SetPortBaudRate(Int32 defaultPortBaudRate)
{
String^ baudRate;Console::Write("Baud Rate(default:{0}): ", defaultPortBaudRate);
baudRate = Console::ReadLine();if (baudRate == "")
{
baudRate = defaultPortBaudRate.ToString();
}return Int32::Parse(baudRate);
}static Parity SetPortParity(Parity defaultPortParity)
{
String^ parity;Console::WriteLine("Available Parity options:");
for each (String^ s in Enum::GetNames(Parity::typeid))
{
Console::WriteLine(" {0}", s);
}Console::Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString());
parity = Console::ReadLine();if (parity == "")
{
parity = defaultPortParity.ToString();
}return (Parity)Enum::Parse(Parity::typeid, parity);
}static Int32 SetPortDataBits(Int32 defaultPortDataBits)
{
String^ dataBits;Console::Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits);
dataBits = Console::ReadLine();if (dataBits == "")
{
dataBits = defaultPortDataBits.ToString();
}return Int32::Parse(dataBits);
}static StopBits SetPortStopBits(StopBits defaultPortStopBits)
{
String^ stopBits;Console::WriteLine("Available Stop Bits options:");
for each (String^ s in Enum::GetNames(StopBits::typeid))//for each可以理解为for语句对特定数据结构的遍历过程的优化……
{
Console::WriteLine(" {0}", s);
}Console::Write("Enter StopBits value (None is not supported and \n" +
"raises an ArgumentOutOfRangeException. \n (Default: {0}):", defaultPortStopBits.ToString());
stopBits = Console::ReadLine();if (stopBits == "")
{
stopBits = defaultPortStopBits.ToString();
}return (StopBits)Enum::Parse(StopBits::typeid, stopBits);
}static Handshake SetPortHandshake(Handshake defaultPortHandshake)
{
String^ handshake;Console::WriteLine("Available Handshake options:");
for each (String^ s in Enum::GetNames(Handshake::typeid))
{
Console::WriteLine(" {0}", s);
}Console::Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString());
handshake = Console::ReadLine();if (handshake == "")
{
handshake = defaultPortHandshake.ToString();
}return (Handshake)Enum::Parse(Handshake::typeid, handshake);}
//这个协议感觉可能和加密有关?
};int main()
{
PortChat::Main();
}

 

 

 

 

 

转载于:https://www.cnblogs.com/Shymuel/p/9327516.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习vue.js的自我梳理笔记

基本语法格式&#xff1a; <script> new Vue({ el: #app, data: { url: http://www.runoob.com } }) </script> 指令 【指令是带有 v- 前缀的特殊属性。】 判断 <p v-if"seen">现在你看到我了</p> 参数 <a v-bind:href"url"&…

722. 删除注释

722. 删除注释 给一个 C 程序&#xff0c;删除程序中的注释。这个程序source是一个数组&#xff0c;其中source[i]表示第i行源码。 这表示每行源码由\n分隔。 在 C 中有两种注释风格&#xff0c;行内注释和块注释。 字符串// 表示行注释&#xff0c;表示//和其右侧的其余字符…

如何创建一个自记录的Makefile

My new favorite way to completely underuse a Makefile? Creating personalized, per-project repository workflow command aliases that you can check in.我最喜欢的完全没用Makefile的方法&#xff1f; 创建个性化的按项目存储库工作流命令别名&#xff0c;您可以检入。…

【BZOJ3262】陌上花开

CDQ分治模板 注意三元组完全相等的情况 1 #include<bits/stdc.h>2 using namespace std;3 const int N100010,K200010;4 int n,k,cnt[N],ans[N];5 struct Node{6 int a,b,c,id;7 bool operator<(const Node& k)const{8 if(bk.b&&ck.c) re…

Spring+jpaNo transactional EntityManager available

2019独角兽企业重金招聘Python工程师标准>>> TransactionRequiredException: No transactional EntityManager availableEntityManager执行以下方法(refresh, persist, flush, joinTransaction, remove, merge) 都需要需要事务if (transactionRequiringMethods.cont…

python项目构建_通过构建4个项目来学习Python网络

python项目构建The Python programming language is very capable when it comes to networking. Weve released a crash course on the freeCodeCamp.org YouTube channel that will help you learn the basics of networking in Python.当涉及到网络时&#xff0c;Python编程…

164. 最大间距

164. 最大间距 给定一个无序的数组&#xff0c;找出数组在排序之后&#xff0c;相邻元素之间最大的差值。 如果数组元素个数小于 2&#xff0c;则返回 0。 示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差…

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 screen工具

通过后台服务的方式在远程主机上建立一个rsync的服务器&#xff0c;在服务器上配置好rsync的各种应用&#xff0c;然后将本机作为rsync的一个客户端连接远程的rsync服务器。在128主机上建立并配置rsync的配置文件/etc/rsyncd.conf,把你的rsyncd.conf编辑成以下内容&#xff1a;…

01_Struts2概述及环境搭建

1.Struts2概述&#xff1a;Struts2是一个用来开发MVC应用程序的框架。Struts2提供了web应用程序开发过程中一些常见问题的解决方案;对用户输入的数据进行合法性验证统一的布局可扩展性国际化和本地化支持Ajax表单的重复提交文件的上传和下载... ...2.Struts2相对于Struts1的优势…

315. 计算右侧小于当前元素的个数

315. 计算右侧小于当前元素的个数 给定一个整数数组 nums&#xff0c;按要求返回一个新数组 counts。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 示例&#xff1a; 输入&#xff1a;nums [5,2,6,1] 输出&#xff1a;[2,1…

IOS上传文件给java服务器,返回报错unacceptable context-type:text/plain

IOS上传文件给java服务器&#xff0c;返回报错unacceptable context-type&#xff1a;text/plain response返回类型不对 RequestMapping(value "uploadMultiFiles", method RequestMethod.POST, produces"application/json;charsetUTF-8") 使用produces指…

Python爬虫框架Scrapy学习笔记原创

字号scrapy [TOC] 开始 scrapy安装 首先手动安装windows版本的Twisted https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted pip install Twisted-18.4.0-cp36-cp36m-win_amd64.whl 安装scrapy pip install -i https://pypi.douban.com/simple/ scrapy windows系统额外需要…

600. 不含连续1的非负整数

600. 不含连续1的非负整数 给定一个正整数 n&#xff0c;找出小于或等于 n 的非负整数中&#xff0c;其二进制表示不包含 连续的1 的个数。 示例 1:输入: 5 输出: 5 解释: 下面是带有相应二进制表示的非负整数< 5&#xff1a; 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101…

高可用性、负载均衡的mysql集群解决方案

2019独角兽企业重金招聘Python工程师标准>>> 一、为什么需要mysql集群&#xff1f; 一个庞大的分布式系统的性能瓶颈中&#xff0c;最脆弱的就是连接。连接有两个&#xff0c;一个是客户端与后端的连接&#xff0c;另一个是后端与数据库的连接。简单如图下两个蓝色框…

Django的model查询操作 与 查询性能优化

Django的model查询操作 与 查询性能优化 1 如何 在做ORM查询时 查看SQl的执行情况 (1) 最底层的 django.db.connection 在 django shell 中使用 python manage.py shell>>> from django.db import connection >>> Books.objects.all() >>> connect…

887. 鸡蛋掉落

887. 鸡蛋掉落 给你 k 枚相同的鸡蛋&#xff0c;并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 0 < f < n &#xff0c;任何从 高于 f 的楼层落下的鸡蛋都会碎&#xff0c;从 f 楼层或比它低的楼层落下的鸡蛋都不会破。 每次…

678. 有效的括号字符串

678. 有效的括号字符串 给定一个只包含三种字符的字符串&#xff1a;&#xff08; &#xff0c;&#xff09; 和 *&#xff0c;写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则&#xff1a; 任何左括号 ( 必须有相应的右括号 )。任何右括号 ) 必须有相应…

Faster R-CNN代码例子

主要参考文章&#xff1a;1&#xff0c;从编程实现角度学习Faster R-CNN&#xff08;附极简实现&#xff09; 经常是做到一半发现收敛情况不理想&#xff0c;然后又回去看看这篇文章的细节。 另外两篇&#xff1a; 2&#xff0c;Faster R-CNN学习总结 这个主要是解释了18,…

剥开比原看代码09:通过dashboard创建密钥时,前端的数据是如何传到后端的?

2019独角兽企业重金招聘Python工程师标准>>> 作者&#xff1a;freewind 比原项目仓库&#xff1a; Github地址&#xff1a;https://github.com/Bytom/bytom Gitee地址&#xff1a;https://gitee.com/BytomBlockchain/bytom 在前面一篇文章&#xff0c;我们粗略的研究…

面试题 17.24. 最大子矩阵

面试题 17.24. 最大子矩阵 给定一个正整数、负整数和 0 组成的 N M 矩阵&#xff0c;编写代码找出元素总和最大的子矩阵。 返回一个数组 [r1, c1, r2, c2]&#xff0c;其中 r1, c1 分别代表子矩阵左上角的行号和列号&#xff0c;r2, c2 分别代表右下角的行号和列号。若有多个…