寫了個實現攝像頭上畫線并輸出角度的東西……雖然很簡單,但腦殘的我還是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();
}
?
?
?
?
?