我目前正在尝试处理图像并检测圆,并通过zigbee将一些协议发送到陆基。我对此进行了研究,并尝试了发现的结果,但没有一个起作用。
以下是我尝试的代码:
#ifdef __BORLANDC__
#pragma hdrstop // borland specific
#include <condefs.h>
#pragma argsused
USEUNIT("Tserial.cpp");
#endif
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <c:\OpenCV243\include\opencv\cv.h>
#include <c:\OpenCV243\include\opencv\highgui.h>
#include <math.h>
#include "Tserial.h"
#include <iostream>
using namespace std;
using namespace cv;
int zigbee_command;
Tserial *zigbee_com;
unsigned char protocol = 0;
int main( int argc, char **argv )
{
CvCapture *capture = 0;
IplImage *img = 0;
int key = 0;
int px;
int py;
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_PLAIN,1.0,1.0,0,1,CV_AA);
#pragma region find_camera
capture = cvCaptureFromCAM( 0 );
#pragma endregion
#pragma region detect_image
if ( !capture ) {
fprintf( stderr, "Cannot open initialize webcam!\n" );
return 1;
}
#pragma endregion
cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );
#pragma region serial
// // serial to zigbee setup
zigbee_com = new Tserial();
if (zigbee_com!=0) {
zigbee_com->connect("COM5", 9600, spNONE); }
//// serial to zigbee setup
#pragma endregion
img = cvQueryFrame( capture );
if (!img)
exit(1);
IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
CvMemStorage* storage = cvCreateMemStorage(0);
while( key != 'q' ) {
img = cvQueryFrame( capture );
if( !img ) break;
cvCvtColor( img, gray, CV_BGR2GRAY );
cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 );
CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100, 20, 100 );
int i;
for( i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(0,0,255), 2, 8, 0 );
cvLine (img, cvPoint(cvRound(p[0]+40),cvRound(p[1])), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]),cvRound(p[1]+40)), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]-40),cvRound(p[1])), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
cvLine (img, cvPoint(cvRound(p[0]),cvRound(p[1]-40)), cvPoint(cvRound(p[0]),cvRound(p[1])), CV_RGB(0,255,0), 1, CV_AA,0);
px=cvRound(p[0]);
py=cvRound(p[1]);
if((px < 330 && px > 320) && (py > 230 && py < 250))
{
cvPutText(img, "CENTER",cvPoint(cvRound(p[0]+45),cvRound(p[1]+45)), &font, CV_RGB(0,0,255));
protocol = 'okie';
zigbee_com->sendChar(protocol);
}
// displays coordinates of circle's center
cout <<"(x,y) -> ("<<px<<","<<py<<")"<<endl;
}
cvShowImage( "result", img );
key = cvWaitKey( 1 );
}
cvDestroyWindow( "result" );
cvReleaseCapture( &capture );
return 0;
}
串行源来自:http://www.tetraedre.com/advanced/serial/
错误:
1> DetectCircle.obj:错误LNK2019:未解析的外部符号
“公共:无效__cdecl Tserial :: sendChar(char)”
函数main中引用的(?sendChar @ Tserial @@ QEAAXD @ Z)
1> DetectCircle.obj:错误LNK2019:未解析的外部符号
“ public:int __cdecl Tserial :: connect(char *,int,enum serial_parity)”
(?connect @ Tserial @@ QEAAHPEADHW4serial_parity @@@@ Z)在
功能主体
1> DetectCircle.obj:错误LNK2019:未解析的外部符号
“公共:__cdecl Tserial :: Tserial(void)”(?? 0Tserial @@ QEAA @ XZ)
在函数main 1> C:\ Users \ Steven \ Documents \ Visual Studio中引用
2010 \ Projects \ mynewproject \ x64 \ Debug \ mynewproject.exe:致命错误
LNK1120:3个未解决的外部元件
最佳答案
这些是链接器错误,因为实现类的Tserial.cpp已复制到同一目录中,而编译器不知道这些错误。您需要去项目|添加现有项目并将其添加到那里,这样它就知道它是项目的一部分并进行构建和链接。
此外,您还有以下代码尝试将字符串存储为单个字符并发送无效的代码:
unsigned char protocol = 0;
protocol = 'okie';
zigbee_com->sendChar(protocol);
基于该类附带的来自sertest2.cpp的示例,您可以使用以下命令发送字符串,其中4是要发送的数据的长度:
zigbee_com->sendArray("okie", 4);
关于c++ - Visual Studio 2010 C++与Zigbee通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14088230/