2012VS+opencv3.0.0程序出现找不到cvNamedWindow

#include
#include
#include

using namespace cv;

int main()
{
// 读入一张图片(游戏原画)
Mat img=imread("pic.jpg");
// 创建一个名为 "游戏原画"窗口
cvNamedWindow("游戏原画");
// 在窗口中显示游戏原画
imshow("游戏原画",img);
// 等待6000 ms后窗口自动关闭
waitKey(6000);
}
--------------分割线--------------------------
输出:

c:\users\lenovo\documents\visual studio 2012\projects\testopencv\testopencv\test.cpp(14): error C3861: 'cvNamedWindow': identifier not found

5个回答

这个错误的意思是opencv配置失败吗?

你没有包含正确的h头文件

project configuration -> directory ->include

http://blog.sina.com.cn/s/blog_7798183d0102w31a.html

改成namedWindow试试

看看有木有namedWindow()

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
2012VS+opencv3.0.0程序出现找不到cvNamedWindow
#include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main() { // 读入一张图片(游戏原画) Mat img=imread("pic.jpg"); // 创建一个名为 "游戏原画"窗口 cvNamedWindow("游戏原画"); // 在窗口中显示游戏原画 imshow("游戏原画",img); // 等待6000 ms后窗口自动关闭 waitKey(6000); } --------------分割线-------------------------- 输出: >c:\users\lenovo\documents\visual studio 2012\projects\testopencv\testopencv\test.cpp(14): error C3861: 'cvNamedWindow': identifier not found
vs2010 opencv2.3 Cannot find or open the PDB file
新手 做了点东西 ``` #include "cv.h" #include "highgui.h" #include <time.h> #include <math.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <iostream> #include <fstream> //#pragma comment(lib,"ws2_32.lib") using namespace cv; using namespace std; // various tracking parameters (in seconds) const double MHI_DURATION = 0.5; const double MAX_TIME_DELTA = 0.5; const double MIN_TIME_DELTA = 0.05; const int N = 3; int fps = 0; int nFrmnum=1; int numFrames=0; int frame; int danger_timestart = 0; int danger_timeend = 0; vector<int> vec; //检测出的感兴趣区域参数 IplImage* dst_img1=0; const int CONTOUR_MAX_AERA = 6000; // ring image buffer IplImage **buf = 0; int last = 0; // temporary images IplImage *mhi = 0; // MHI: motion history image int filter = CV_GAUSSIAN_5x5; CvConnectedComp *cur_comp, min_comp; CvConnectedComp comp; CvMemStorage *storage; CvPoint pt[4]; void update_mhi( IplImage* img, IplImage* dst, int diff_threshold, int danger_x[4],int danger_y[4],int danger_width,int danger_length );//**_由于篇幅的限制,这个方法我就不贴了_** // 参数: // img – 输入视频帧 // dst – 检测结果 int main(int argc, char** argv) { IplImage* motion = 0; CvCapture* capture = 0; argv[1] = "F:\\walk.avi"; argv[2] = "walk"; char * filepath = argv[1]; string filename = argv[2]; int danger_x[4]; //定义危险区域的边界顶点坐标 int danger_y[4]; int danger_width=300; //定义危险区域的宽度 int danger_length=280; //定义危险区域的长度 danger_x[0]=200; danger_y[0]=300; danger_x[3]=500; danger_y[3]=50; danger_x[1]=danger_x[0]+danger_width; danger_y[1]=danger_y[0]+danger_length; danger_x[2]=danger_x[3]+danger_width-20; danger_y[2]=danger_y[3]+danger_length; //if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 ); // else if( argc == 2 ) capture = cvCaptureFromAVI( filepath ); fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); cout<< "帧率" <<fps <<endl; numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); cout<<"总帧数" <<numFrames <<endl; if( capture ) { cvNamedWindow( "Motion", 1 ); for(;;) { IplImage* image; if( !cvGrabFrame( capture )) break; image = cvQueryFrame( capture ); if( image ) { frame++; if( !motion ) { motion = cvCreateImage( cvSize(image->width,image->height), 8, 1 ); cvZero( motion ); motion->origin = image->origin; } } frame++; update_mhi( image, motion, 60 ,danger_x,danger_y, danger_width, danger_length ); cvShowImage( "Motion", image ); if( cvWaitKey(100) >= 0 ) break; } cvReleaseCapture( &capture ); cvDestroyWindow( "Motion" ); } sort( vec.begin(), vec.end() ); vec.erase( unique( vec.begin(), vec.end() ), vec.end() ); for(std::vector<int>::iterator m = vec.begin(); m != vec.end(); m++ ) //用迭代器的方式输出容器对象的值 { cout<<*m<<endl; } string outfilename = "data_"+filename+".txt"; ofstream out(outfilename); for(std::vector<int>::iterator m = vec.begin(); m != vec.end(); m++ ) //用迭代器的方式输出容器对象的值 { out<<"入侵时间点:"<<*m<<endl; } return 0; } ``` 运行时候出现下面错误: 已加载“C:\Windows\System32\ntdll.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\kernel32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\KernelBase.dll”,已加载符号(去除源信息)。 已加载“F:\125\OpenCV64\OpenCV2.3\build\x64\vc10\bin\opencv_core230d.dll”,Cannot find or open the PDB file 已加载“C:\Windows\System32\msvcp100d.dll”,已加载符号。 已加载“C:\Windows\System32\msvcr100d.dll”,已加载符号。 已加载“F:\125\OpenCV64\OpenCV2.3\build\x64\vc10\bin\opencv_video230d.dll”,Cannot find or open the PDB file 已加载“F:\125\OpenCV64\OpenCV2.3\build\x64\vc10\bin\opencv_imgproc230d.dll”,Cannot find or open the PDB file 已加载“F:\125\OpenCV64\OpenCV2.3\build\x64\vc10\bin\tbb_debug.dll”,Cannot find or open the PDB file 已加载“F:\125\OpenCV64\OpenCV2.3\build\x64\vc10\bin\opencv_highgui230d.dll”,Cannot find or open the PDB file 已加载“C:\Windows\System32\user32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\gdi32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\lpk.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\usp10.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\msvcrt.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\ole32.dll”,已加载符号。 已加载“C:\Windows\System32\rpcrt4.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\oleaut32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\advapi32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\sechost.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\winsxs\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_a4d6a923711520a9\comctl32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\avifil32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\winmm.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\msacm32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\msvfw32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\shell32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\shlwapi.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\avicap32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\version.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\imm32.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\msctf.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\cryptbase.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\uxtheme.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\clbcatq.dll”,已加载符号(去除源信息)。 已加载“C:\Windows\System32\msrle32.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\msrle32.dll” 已加载“C:\Windows\System32\msvidc32.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\msvidc32.dll” 已加载“C:\Windows\System32\msyuv.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\msyuv.dll” 已加载“C:\Windows\System32\msyuv.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\msyuv.dll” 已加载“C:\Windows\System32\msyuv.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\msyuv.dll” 已加载“C:\Windows\System32\iyuv_32.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\iyuv_32.dll” 已加载“C:\Windows\System32\iyuv_32.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\iyuv_32.dll” 已加载“C:\Windows\System32\tsbyuv.dll”,已加载符号(去除源信息)。 已卸载“C:\Windows\System32\tsbyuv.dll” 本机”已退出,返回值为 0 (0x0)。 出问题的那几个文件,在对应的路径下面都有。 我把这个几个文件拷到工程下边也会出现问题。 也是报“Cannot find or open the PDB file”,不过前边的路径倒是变成工程的路径了。 求指导,求帮助,我已经卡住好久了。
opencv 在vs下event出现问题
我原来在linux下面配置的opencv环境,写了一些代码,后来需要移到windows下面,在vs2012里面构建起来,结果就出现了一些问题 代码如下 #include "stdfx.h" #include "cv.h" #include "highgui.h" #include "cstdlib" using namespace std; const int windowsizex = 400; const int windowsizey = 400; const int stacksize = 1000; CvPoint pointstack[stacksize]; int top = 0; CvPoint begin; CvPoint end; int counter = 0; void printline(IplImage* img) { cvLine(img , begin , end , cvScalar(255 , 255 , 255) , 1); } void my_mouse_callbacck(int event , int x , int y , int flags , void* param) { IplImage* image = (IplImage*) param; if(flags == CV_EVENT_FLAG_CTRLKEY) { if(event == CV_EVENT_LBUTTONDOWN) cout<<"yes"<<endl; //scanlinefill(x , y , image); } else { switch(event){ case CV_EVENT_MOUSEMOVE : { if(counter != 0) end = cvPoint(x , y); } break; case CV_EVENT_LBUTTONDOWN : { if(counter > 0) { end = begin; begin = cvPoint(x , y); printline(image); //print the important line inside the mouse event } else { begin = cvPoint(x , y); end = cvPoint(x , y); } counter++; } break; case CV_EVENT_LBUTTONDBLCLK : { counter = 0; } } } } int main(int argc , char** argv) { IplImage* img = cvCreateImage(cvSize(windowsizex , windowsizey) ,IPL_DEPTH_8U , 3); cvZero(img); IplImage* temp = cvCloneImage(img); cvNamedWindow("book3" , CV_WINDOW_AUTOSIZE); cvSetMouseCallback("book3" , my_mouse_callbacck , (void*)img); while(true) { cvCopyImage(img , temp); if(counter > 0) printline(temp); cvShowImage("book3" , temp); if(cvWaitKey(15) == 27) break; } cvReleaseImage(&img); cvReleaseImage(&temp); cvDestroyWindow("book3"); return 0; } 程序大概就是左键开始画线,每按一下都有一个拐点,双击的时候画线停止 问题如下: 就在mouse_callback这个函数里面,如果按下了alt键,然后再按左键,应该会调用一个函数,这里就用cout来验证了 if(flags == CV_EVENT_FLAG_CTRLKEY) { if(event == CV_EVENT_LBUTTONDOWN) cout<<"yes"<<endl; //scanlinefill(x , y , image); } 本来在linux下面是能够正常执行的。 不过在windows的vs下面就不能够正常执行了,就是cout那一句一直没有执行出来。 不过如果在FLAG_CTRLKEY那个大括号里面添加上一句cout是能够执行的。 而且不按住alt的那些鼠标操作switch等等的,都能够正常操作。 不知道是什么原因? 求大神指点,先谢过。
懂交叉编译或ld.so.conf或者或者zedboard或者动态库相关的请进来。。
小弟最近没事儿,又研究了一下交叉编译opencv的事情。 第一步:在电脑上交叉编译opencv,make,make install之后,我把相关的include/和/lib和/share分别拷贝到zedboard板上的/usr/local/include ,/usr/local/lib/ ,/usr/local/share。在板子上运行的是linaro桌面系统. 第二步:在电脑上我用cmake指定交叉编译工具,库文件和头文件(都是交叉编译出来的,也就是arm平台的头文件和库文件),编译了源代码DisplayImage.cpp(这个代码其实就是《zynq协同 设计指南》这本书里面的那个egedetect.cpp的代码),生成可执行程序DisplayImage。 第三步:将DisplayImage拷贝到板子上运行: root@linaro-ubuntu-desktop:/mnt#./DisplayImage lena.jpg lena1.jpg ./DisplayImage: error while loading shared libraries: libopencv_calib3d.so.2.4: cannot open shared object file: No such file or directory 第四步:以上原因相信大家都知道,找不到共享库,于是我在/etc/ld.so.conf文件中添加了一行,如下可以看出: root@linaro-ubuntu-desktop:/mnt# cat /etc/ld.so.conf include /etc/ld.so.conf.d/*.conf /usr/local/lib 而我们需要的库libopencv_calib3d.so.2.4就在/usr/local/lib下面:如下可以看出: root@linaro-ubuntu-desktop:/mnt# ls /usr/local/lib/ |grep calib3d* libopencv_calib3d.so libopencv_calib3d.so.2.4 libopencv_calib3d.so.2.4.6 这些都确认好了之后,执行root@linaro-ubuntu-desktop:/mnt# /sbin/ldconfig 按理说,应该就是一切OK了赛,但是执行程序的时候效果如下: root@linaro-ubuntu-desktop:/mnt# /sbin/ldconfig root@linaro-ubuntu-desktop:/mnt# ./DisplayImage lena.jpg lena1.jpg ./DisplayImage: error while loading shared libraries: libopencv_calib3d.so.2.4: cannot open shared object file: No such file or directory **呵呵呵呵。。。还是不得行。然后我看了一下已经加载的共享库:** root@linaro-ubuntu-desktop:/mnt# ldconfig -p | grep calib3d libopencv_calib3d.so.2.4 (libc6) => /usr/local/lib/libopencv_calib3d.so.2.4 libopencv_calib3d.so (libc6) => /usr/local/lib/libopencv_calib3d.so 可以看出是已经加载了这个共享库的哦。 但是程序执行的时候怎么都找不到。 这是怎么回事:?????? 第五步:我们换种方法试试看,用LD_LIBRARY_PATH试试,具体如下: root@linaro-ubuntu-desktop:/mnt# export LD_LIBRARY_PATH=/usr/local/lib 然后执行程序看看什么情况,如下: root@linaro-ubuntu-desktop:/mnt# ./DisplayImage lena.jpg lena1.jpg root@linaro-ubuntu-desktop:/mnt# ls ?? AutoUnattend.xml backup lena.jpg sources ?? DisplayImage boot new support ??? WIN7Activation_1.7_XiaZaiBa.zip bootmgr setup.exe test ????? autorun.inf efi slope.cpp upgrade **这次程序执行时没得错误了,但是没得结果啊,这个程序时将lena.jpg采用什么边缘算子之后输出之后的图像lena1.jpg。。 查看了,没有生成lena1.jpg..** 这又是怎么回事儿》》????? **第六步:问题就来了,问什么用了ld.so.con这种方法,还是找不到库,而是用LD_LIBRARY_PAHT之后就可以?按理说应该都可以的问题就来了,为什么执行程序不出错,但是没有保存图像啊。。** 附录:DisplayImage.cpp的代码. #include "cv.h" #include "highgui.h" IplImage* doCanny( IplImage* in, double lowThresh, double highThresh, double aperture) { if (in->nChannels != 1) return(0); // Canny only handles gray scale images IplImage* out = cvCreateImage( cvGetSize( in ), in->depth, //IPL_DEPTH_8U, 1); cvCanny( in, out, lowThresh, highThresh, aperture ); return( out ); }; int main( int argc, char** argv ) { if(argc!= 3)printf("arguments error! format origin_image.bmp target_image.bmp\n"); IplImage* img_rgb = cvLoadImage( argv[1] ); IplImage* img_gry = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, 1); cvCvtColor(img_rgb, img_gry ,CV_BGR2GRAY); // cvNamedWindow("Example Gray", CV_WINDOW_AUTOSIZE ); // cvNamedWindow("Example Canny", CV_WINDOW_AUTOSIZE ); // cvShowImage("Example Gray", img_gry ); IplImage* img_cny = doCanny( img_gry, 10, 100, 3 ); if(cvSaveImage(argv[2],img_cny,0)!=0) printf("Save Image Successful\n"); // cvShowImage("Example Canny", img_cny ); // cvWaitKey(0); cvReleaseImage( &img_rgb); cvReleaseImage( &img_gry); cvReleaseImage( &img_cny); // cvDestroyWindow("Example Gray"); // cvDestroyWindow("Example Canny"); return 0; }
opencv初学者 为什么调用摄像头 怎么出现捕获源什么框框的。。。
> ![图片说明](https://img-ask.csdn.net/upload/201509/01/1441112438_690201.png) 用的opencv 4.8 和vs 2010 这是调用的那个cpp代码 /*打开摄像头,通过摄像头进行实时人数统计*/ #include "peoplecounting.h" #include "cv.h" #include "highgui.h" #include "cxcore.h" #include "cvaux.h" #include "cxcore.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <math.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> #include <iostream> #include <qfiledialog.h> #include <qmessagebox.h> using namespace std; void peoplecounting::SelectTheCamera() { //初始化内存及分类器 static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; //加载分类器,名称为"xml.xml" const char* cascade_name="C:/Users/kjyszylkj/Desktop/460518377Count/Count/Count/xml.xml"; cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); if( !cascade ) { QMessageBox::information( 0, "错误", "不能加载分类器", QMessageBox::Ok); } //定义某一帧的图片、灰度图及haar图 IplImage* pFrame = NULL; IplImage* pHaarImg = NULL; IplImage* pGrayImg = NULL; int nFrmNum = 0; cvNamedWindow("camera",1); cvMoveWindow("camera",30,0); //打开自带摄像头 CvCapture* pCapture = cvCreateCameraCapture(-1); if(!(pCapture)) { QMessageBox::information( 0, "错误", "不能打开摄像头", QMessageBox::Ok); } else { while(pFrame = cvQueryFrame(pCapture)) //如果能够捕获到视频 { nFrmNum++; //如果这是第一帧视频,需要申请内存并初始化 if(nFrmNum == 1) { pGrayImg = cvCreateImage(cvSize(pFrame->width,pFrame->height),8,1); pHaarImg = cvCreateImage(cvSize(cvRound(pFrame->width/1.1),cvRound(pFrame->height/1.1)),8,1); //转化为灰度图像再处理 cvCvtColor(pFrame, pGrayImg,CV_BGR2GRAY); //缩放灰度图像 cvResize(pGrayImg,pHaarImg,CV_INTER_LINEAR); } else { cvGrabFrame(pCapture); //抓取一帧 pFrame = cvRetrieveFrame(pCapture); //将图像从缓存中转换为IplImage存在pFrame中 //转化为灰度图像 cvCvtColor(pFrame,pGrayImg,CV_BGR2GRAY); //缩放灰度图像 cvResize(pGrayImg, pHaarImg,CV_INTER_LINEAR); //直方图均衡化 cvEqualizeHist(pHaarImg,pHaarImg); //分配内存空间 storage = cvCreateMemStorage(0); //人数统计 if(cascade) { //检测窗口每次放大1.1倍 double scale = 1.1; int i; //使用分类器进行人脸检测 CvSeq* PeopleCounting = cvHaarDetectObjects( pHaarImg, cascade, storage, scale, 2, 0/*"CV_HAAR_DO_CANNY_PRUNING"*/, cvSize(30,30) ); //在检测到的人脸上画出红色圆圈标记 for(i=0;i<(PeopleCounting?PeopleCounting->total:0);i++) { CvRect* r = (CvRect*)cvGetSeqElem(PeopleCounting,i); //返回矩形的信息 CvPoint center; int radius; center.x = cvRound((r->x + r->width*0.5)*scale); //圆心横坐标 center.y = cvRound((r->y + r->height*0.5)*scale); //圆心纵坐标 radius = cvRound((r->width + r->height)*0.25*scale); //半径 cvCircle(pFrame, center, radius, CV_RGB(255,0,0), 3, 8, 0 ); //(图像,圆心,半径,颜色,粗细,线条类型,小数点位数) } //将人数的个数显示到主窗口 int number; number = PeopleCounting->total; QString tmp; tmp = QString("副窗口画面中一共有%1个人").arg(number); //文字信息 ui->textEdit->setText(QString(tmp)); //设置文字信息 ui->textEdit->setAlignment( Qt::AlignCenter ); //设置文字居中 } //显示每一帧的图像 cvShowImage("camera",pFrame); char key = cvWaitKey(1000); } } //释放图像 cvReleaseImage(&pFrame); cvReleaseImage(&pHaarImg); cvReleaseImage(&pGrayImg); cvWaitKey(0); //销毁窗口 cvDestroyWindow("camera"); //释放摄像头 cvReleaseCapture(&pCapture); } } 各位大侠求救!!!
opencv 字符分割结果排列
如题,对字符图片进行字符分割,采用的外轮廓最小外接矩形的方法,分割效果如图![图片说明](https://img-ask.csdn.net/upload/201506/05/1433478793_843497.png) 为什么顺序不是从右到左呀,这样没有顺序的分割没太有意义呀。请问有人知道怎么改成分割后结果顺序从右到左或者从左到右么,谢谢!!!!代码如下 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "cxcore.h" int main(int argc, char* argv[]) { IplImage* imgSrc = cvLoadImage("C:\\Users\\think\\Desktop\\腐蚀膨胀结果.jpg",CV_LOAD_IMAGE_COLOR); IplImage* img_gray = cvCreateImage(cvGetSize(imgSrc), IPL_DEPTH_8U, 1); cvCvtColor(imgSrc, img_gray, CV_BGR2GRAY); cvThreshold(img_gray, img_gray,100, 255,CV_THRESH_BINARY);// CV_THRESH_BINARY_INV使得背景为黑色,字符为白色,这样找到的最外层才是字符的最外层 cvShowImage("ThresholdImg",img_gray); CvSeq* contours = NULL; CvMemStorage* storage = cvCreateMemStorage(0); int count = cvFindContours(img_gray, storage, &contours,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,cvPoint(0,0)); printf("轮廓个数:%d",count); int idx = 0; char szName[56] = {0}; int tempCount=0; for (CvSeq* c = contours; c != NULL; c = c->h_next) { CvRect rc =cvBoundingRect(c,0); cvDrawRect(imgSrc, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0)); IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3); cvSetImageROI(imgSrc, rc); cvCopyImage(imgSrc, imgNo); cvResetImageROI(imgSrc); sprintf(szName, "wnd_%d", idx++); cvNamedWindow(szName); cvShowImage(szName, imgNo); cvReleaseImage(&imgNo); } cvNamedWindow("src"); cvShowImage("src", imgSrc); cvWaitKey(0); cvReleaseMemStorage(&storage); cvReleaseImage(&imgSrc); cvReleaseImage(&img_gray); cvDestroyAllWindows(); return 0; }
mfc+MATLAB+opencv出现内存泄露问题
我的程序这么多的内存泄露,但是不知道具体是哪的原因,我想做的是vs与MATLAB混合编程实现图像处理。 Detected memory leaks! Dumping objects -> {301} normal block at 0x007DC1F8, 47 bytes long. Data: <JPEG-2000 Code S> 4A 50 45 47 2D 32 30 30 30 20 43 6F 64 65 20 53 这是vc++程序 void CMFCApplication17Dlg::OnClickedButton5() { { // TODO: Add your control notification handler code here //CFileDialog fDlg(TRUE,"bmp","*.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, //"原始图像(*.bmp)|*.bmp|所有文件(*.*)|*.*||",NULL); //if (fDlg.DoModal() == TRUE) //{ //Open_Filename = fDlg.GetFileName(); IplImage *image=NULL; if(image) cvReleaseImage(&image); image = cvLoadImage("H:\\lena.bmp",1); if (image==0) MessageBox("Reading Failed"); else DrawPicToHDC(image, IDC_showimage); cvReleaseImage(&image); } } //} void CMFCApplication17Dlg::DrawPicToHDC(IplImage *img, UINT ID) { CDC *pDC = GetDlgItem(ID)->GetDC(); HDC hDC= pDC->GetSafeHdc(); CRect rect; CWnd * pWnd; pWnd=GetDlgItem(ID); pWnd->SetWindowPos( NULL,0,0,img->width,img->height,SWP_NOZORDER | SWP_NOMOVE ); pWnd->GetClientRect(&rect); CvvImage cimg; cimg.CopyOf(img); cimg.DrawToHDC(hDC,&rect); ReleaseDC(pDC); } void CMFCApplication17Dlg::OnClickedButton1() { if( !lvboInitialize()) { printf("Could not initialize !"); return ; } _CrtDumpMemoryLeaks(); IplImage *image=NULL; if(image) cvReleaseImage(&image); image = cvLoadImage("H:\\lena.bmp",1); if (image==0) MessageBox("Reading Failed"); mwArray mwdisp(image->height*image->width,mxUINT8_CLASS); IplImage* pTemp = cvCreateImage(cvSize(image->height, image->width), IPL_DEPTH_8U, 1); //n*m创建图像 cvTranspose(image, pTemp);//m*n->n*m,复制image中的数据到ptemp中 CvMat* pMat = cvCreateMat(image->height, image->width, CV_8UC1);//pmat:n*m分配矩阵空间 cvConvert(pTemp, pMat);//pmat:n*m,将图像转化为矩阵,任意类型数据的矩阵 mwdisp.SetData(pMat->data.ptr, pMat->height*pMat->width); cvReleaseMat(&pMat); mwArray ImageData(image->height,image->width ,mxDOUBLE_CLASS); cvReleaseImage( &pTemp ); shiyan2(1,ImageData,mwdisp); IplImage* pTempL0 = cvCreateImage(cvSize(image->height, image->width), IPL_DEPTH_64F, 1); //n*m CvMat* pMatL0 = cvCreateMat(pTempL0->height, pTempL0->width, CV_64FC1);//n*m ImageData.GetData(pMatL0->data.db,pMatL0->height*pMatL0->width); cvConvert(pMatL0,pTempL0);//mat->iplimage cvReleaseMat(&pMatL0); IplImage* pL0SmoothImg =cvCreateImage(CvSize(cvGetSize(image)),IPL_DEPTH_64F,1);//m*n cvTranspose(pTempL0, pL0SmoothImg); //n*m->m*n cvReleaseImage( &pTempL0 ); IplImage* result =cvCreateImage(CvSize(cvGetSize(image)),IPL_DEPTH_8U,1); cvReleaseImage( &image ); double minVal; double maxVal; cvMinMaxLoc(pL0SmoothImg, &minVal, &maxVal); printf("%f ",minVal); printf("%f",maxVal); // Normalize image (0 - 255) to be observed as an u8 image double scale = 255/(maxVal - minVal); double shift = -minVal * scale; cvConvertScale(pL0SmoothImg,result,scale,shift);// cvNamedWindow("去噪后图像",CV_WINDOW_AUTOSIZE); cvShowImage("去噪后图像",image); cvWaitKey(0); DrawPicToHDC(image, IDC_showimage2); //cvReleaseMat(&pMat); cvReleaseImage( &pL0SmoothImg); cvReleaseImage( &result ); lvboTerminate(); } 下面是配置生成的MATLAB程序 function h=lvboshibie(a) %a=imread('lena.bmp'); %figure;imshow(a); %title('原图像'); a=im2double(a);%将数变为double型数 d=100.*a;%求出估计的灰度时用数据 b=imnoise(a,'gaussian',0.015); C=im2double(b); b=im2col(C,[3,3],'distinct');%将加躁图像分割成3*3的小窗口 [i,j]=size(b); m=zeros(i,j); n=size(i,j); for i=1:9 for j=1:5180 m(i,j)=b(i,j)-b(5,j);%用3*3的窗口中的中心值对窗口中的数据求出估计的受躁程度 m(5,j)=0.001; n(i,j)=m(i,j)./b(5,j); end end %为用accumarray函数把数据变回原来的排列方式做准备 %制造c矩阵 K=[1 1 0;1 2 0;1 3 0;2 1 0;2 2 0;2 3 0;3 1 0;3 2 0;3 3 0]; A=K; for ii=1:5179; A=[A;K]; end g=zeros(1,5180); b=[1:5180]; b=[g,g,b]; b=[b;b;b;b;b;b;b;b;b]; b=reshape(b,[46620,3]); c=A+b; val=reshape(n,[46620,1]); A=accumarray(c,val);%使用此函数把原来用im2col变成9*5180的矩阵变为一个个3*3的小矩阵 D=reshape(A,[3,15540]); %将矩阵变为原来的222*210的形式 M = []; B=[]; for i = 1:3:15538 temp=D(:,i:i+2); M = [M; temp]; % 使矩阵变为15540*3 end for j=1:222:15539 TEMP=M(j:j+221,:); B = [B, TEMP]; % 使矩阵变为220*210 end %使矩阵为222*208 B=B(1:222,1:208); E=B+100; r=d./E; e=im2uint8(r); f=im2uint8(a); [m,n]=size(e); for i=1:m for j=1:n if (e(i,j)>=0)&&(e(i,j)<=50) u=23; q=23/3; v(i,j)=e(i,j)-u; V(1)=2*q^2; elseif (e(i,j)>=51)&&(e(i,j)<=100) u=83; q=47/3; v(i,j)=e(i,j)-u; V(2)=2*q^2; else u=117; q=138/3; v(i,j)=e(i,j)-u; V(3)=2*q^2; end end end v=im2double(v); Q=v.^2; for i=1:m for j=1:n if (e(i,j)>=0)&&(e(i,j)<=50) H(i,j)=im2double(Q(i,j)/V(1)); N(i,j)=exp(-H(i,j)); elseif (e(i,j)>=51)&&(e(i,j)<=100) H(i,j)=im2double(Q(i,j)/V(2)); N(i,j)=exp(-H(i,j)); else H(i,j)=im2double(Q(i,j)/V(3)); N(i,j)=exp(-H(i,j)); end end end s=ones(224,210); l=s*26; l(2:223,2:209)=e; o=zeros(224,210); o(2:223,2:209)=N; [m,n]=find(l<=25); q=size(m); for i=1:q x(m(i),n(i))=l(m(i)-1,n(i)-1)*o(m(i)-1,n(i)-1)+l(m(i)-1,n(i))*o(m(i)-1,n(i))+l(m(i)-1,n(i)+1)*o(m(i)-1,n(i)+1)+l(m(i),n(i)-1)*o(m(i),n(i)-1)+l(m(i),n(i))*o(m(i),n(i))+l(m(i),n(i)+1)*o(m(i),n(i)+1)+l(m(i)+1,n(i)-1)*o(m(i),n(i)-1)+l(m(i)+1,n(i))*o(m(i)+1,n(i))+l(m(i)+1,n(i)+1)*o(m(i)+1,n(i)+1); y(m(i),n(i))=o(m(i)+1,n(i))+o(m(i),n(i))+o(m(i)-1,n(i))+o(m(i)+1,n(i)-1)+o(m(i)-1,n(i)-1)+o(m(i),n(i)-1)+o(m(i)-1,n(i)+1)+o(m(i),n(i)+1)+o(m(i)+1,n(i)+1); l(m(i),n(i))=x(m(i),n(i))/y(m(i),n(i)); end h=l(2:223,2:209); h=round(h); %figure,imshow(h,[]); %title('第二次去噪效果'); end 不知道到底是哪的问题,还请大家帮帮忙,先谢谢了。
关于learning opencv这本书的源码
在学习learning opencv这本书,在调试第12章的源码时,有一个问题怎么也调不通,目测是指针问题,但是一直找不到哪里有问题。 ``` #include "stdafx.h" #include "cv.h" #include "cxmisc.h" #include "highgui.h" //#include "cvaux.h" #include <vector> #include <string> #include <algorithm> #include <stdio.h> #include <ctype.h> using namespace std; // // Given a list of chessboard images, the number of corners (nx, ny) // on the chessboards, and a flag: useCalibrated for calibrated (0) or // uncalibrated (1: use cvStereoCalibrate(), 2: compute fundamental // matrix separately) stereo. Calibrate the cameras and display the // rectified results along with the computed disparity images. // static void StereoCalib(const char* imageList, int nx, int ny, int useUncalibrated) { int displayCorners = 0; int showUndistorted = 1; bool isVerticalStereo = false;//OpenCV can handle left-right //or up-down camera arrangements const int maxScale = 1; const float squareSize = 1.f; //Set this to your actual square size FILE* f = fopen(imageList, "rt"); int i, j, lr, nframes, n = nx*ny, N = 0; vector<string> imageNames[2]; vector<CvPoint3D32f> objectPoints; vector<CvPoint2D32f> points[2]; vector<int> npoints; vector<uchar> active[2]; vector<CvPoint2D32f> temp(n); CvSize imageSize = {0,0}; // ARRAY AND VECTOR STORAGE: double M1[3][3], M2[3][3], D1[5], D2[5]; double R[3][3], T[3], E[3][3], F[3][3]; CvMat _M1 = cvMat(3, 3, CV_64F, M1 ); CvMat _M2 = cvMat(3, 3, CV_64F, M2 ); CvMat _D1 = cvMat(1, 5, CV_64F, D1 ); CvMat _D2 = cvMat(1, 5, CV_64F, D2 ); CvMat _R = cvMat(3, 3, CV_64F, R ); CvMat _T = cvMat(3, 1, CV_64F, T ); CvMat _E = cvMat(3, 3, CV_64F, E ); CvMat _F = cvMat(3, 3, CV_64F, F ); if( displayCorners ) cvNamedWindow( "corners", 1 ); // READ IN THE LIST OF CHESSBOARDS: if( !f ) { fprintf(stderr, "can not open file %s\n", imageList ); return; } for(i=0;;i++) { char buf[1024]; int count = 0, result=0; lr = i % 2; vector<CvPoint2D32f>& pts = points[lr]; //points0和1分别是左右图像 if( !fgets( buf, sizeof(buf)-3, f )) break; size_t len = strlen(buf); while( len > 0 && isspace(buf[len-1])) buf[--len] = '\0'; if( buf[0] == '#') continue; IplImage* img = cvLoadImage( buf, 0 ); //打开图像到img if( !img ) break; imageSize = cvSize((*img).width, (*img).height); //imageSize = cvGetSize(img); imageNames[lr].push_back(buf); //FIND CHESSBOARDS AND CORNERS THEREIN: for( int s = 1; s <= maxScale; s++ ) //一张图像检测maxscale次 { IplImage* timg = img; if( s > 1 ) //检测不到怎么办,扩大图像使之更容易检测 { timg = cvCreateImage(cvSize(img->width*s,img->height*s), img->depth, img->nChannels ); cvResize( img, timg, CV_INTER_CUBIC ); } result = cvFindChessboardCorners( timg, cvSize(nx, ny), &temp[0], &count, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE); if( timg != img ) cvReleaseImage( &timg ); if( result || s == maxScale ) //检测角点完成或者达到最大检测次数 for( j = 0; j < count; j++ ) { temp[j].x /= s; //temp储存的是精确坐标 temp[j].y /= s; } if( result ) break; } if( displayCorners ) { printf("%s\n", buf); IplImage* cimg = cvCreateImage( imageSize, 8, 3 ); cvCvtColor( img, cimg, CV_GRAY2BGR ); cvDrawChessboardCorners( cimg, cvSize(nx, ny), &temp[0], count, result ); cvShowImage( "corners", cimg ); cvWaitKey(); //注意不写这个无法显示图像 cvReleaseImage( &cimg ); if( cvWaitKey(0) == 27 ) //Allow ESC to quit exit(-1); } else putchar('.'); //一个.表示执行完一张图 N = pts.size(); // pts.resize(N + n, cvPoint2D32f(0,0)); //pts是个容器,将pts调整到能容纳原来的元素和角点个数 active[lr].push_back((uchar)result); //assert( result != 0 ); if( result ) { //Calibration will suffer without subpixel interpolation cvFindCornerSubPix( img, &temp[0], count, cvSize(11, 11), cvSize(-1,-1), cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 30, 0.01) ); copy( temp.begin(), temp.end(), pts.begin() + N ); } cvReleaseImage( &img ); } fclose(f); printf("\n"); // HARVEST CHESSBOARD 3D OBJECT POINT LIST: nframes = active[0].size();//Number of good left chessboads picture found objectPoints.resize(nframes*n); //使objectPoints能够包含全部图像的角点个数 for( i = 0; i < ny; i++ ) for( j = 0; j < nx; j++ ) objectPoints[i*nx + j] = cvPoint3D32f(i*squareSize, j*squareSize, 0); for( i = 1; i < nframes; i++ ) copy( objectPoints.begin(), objectPoints.begin() + n, objectPoints.begin() + i*n ); npoints.resize(nframes,n); N = nframes*n; CvMat _objectPoints = cvMat(1, N, CV_32FC3, &objectPoints[0] ); CvMat _imagePoints1 = cvMat(1, N, CV_32FC2, &points[0][0] ); CvMat _imagePoints2 = cvMat(1, N, CV_32FC2, &points[1][0] ); //points的第一个索引,0是left,1是right CvMat _npoints = cvMat(1, npoints.size(), CV_32S, &npoints[0] ); //npoints的第i个元素指的是第i个图片有多少个角点 cvSetIdentity(&_M1); cvSetIdentity(&_M2); cvZero(&_D1); cvZero(&_D2); // CALIBRATE THE STEREO CAMERAS printf("Running stereo calibration ..."); fflush(stdout); cvStereoCalibrate( &_objectPoints, &_imagePoints1, &_imagePoints2, &_npoints, &_M1, &_D1, &_M2, &_D2, imageSize, &_R, &_T, &_E, &_F, cvTermCriteria(CV_TERMCRIT_ITER+ CV_TERMCRIT_EPS, 100, 1e-5), CV_CALIB_FIX_ASPECT_RATIO + CV_CALIB_ZERO_TANGENT_DIST + CV_CALIB_SAME_FOCAL_LENGTH ); } int main(void) { StereoCalib("ch12_list.txt", 9, 6, 1); return 0; } ``` 在调试过程中会出现![图片说明](https://img-ask.csdn.net/upload/201711/18/1511003216_595462.png) 初步调试应该是cvStereoCalibrate函数出了问题,c++基础不好,求大神帮忙看看啊。。。
关于cvWaitKey的工作机理;图像的闪烁问题;CPU下降措施
``` void IVE2OPENCV_Showimage_Grey(IVE_SRC_IMAGE_S *ive_img) { HI_U32 return_flag=0; IplImage* cv_img=NULL; cv_img=cvCreateImage(cvSize(ive_img->u16Width,ive_img->u16Height),8,1); cv_img->imageData=(char*)ive_img->pu8VirAddr[0]; cvNamedWindow("bendan"); cvShowImage("bendan",cv_img); cvWaitKey(50);//?这个函数的作用 cvDestroyWindow("bendan"); cvReleaseImage(&cv_img); cv_img=NULL; } ``` 问题: 1.cvWaitKey的工作机理,是按键触发么?按键触发之前,CPU空闲么? 2.cvWaitKey(int t );当t>0时,是不是等待多少毫秒后在工作? 3.上述代码中,我想显示图片为什么一直闪烁,我没有不是应该隔50毫秒,在更新么? 4.为了进一步移植到下位机,老大要减低程序执行的CPU,目前是25%,但是当我在显示图像中增加cvWaitKey(50)后,cpu的占有率明显下降,是12%。这是什么原理,增加cvWaitKey(50)后,会影响循环程序单次执行的时间么?(主要是我自己测试了一下,处理时间没有增加,竟然有些下降?什么原因)
别人给的各种运动目标检测方法的代码,不知道少了什么东西一直调不通
1.我用的是VS2013,配置的是OpenCV3.4.0,运行如下程序的时候就说有许多未定义的标识符,琢磨了好久就是不知道哪里出了问题。求大神帮我看看程序。看看哪里出了问题,,需要的话我可以把整个程序发过去,(有偿) ``` #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp> #include <stdio.h> #include <stdlib.h> //#include "cvaux.h" #include "codeb.h" int CVCONTOUR_APPROX_LEVEL = 2; int CVCLOSE_ITR = 1; #define CV_CVX_WHITE CV_RGB(0xff,0xff,0xff) #define CV_CVX_BLACK CV_RGB(0x00,0x00,0x00) codeBook* cA; codeBook* cC; codeBook* cD; int maxMod[CHANNELS]; int minMod[CHANNELS]; unsigned cbBounds[CHANNELS]; bool ch[CHANNELS]; int nChannels = CHANNELS; int imageLen = 0; uchar *pColor; int Td; int Tadd; int Tdel; int T=50; int Fadd=35; int Tavgstale=50; int Fd=2; int Tavgstale_cD=50; int fgcount=0; float beta=0.1f; float gamma=0.1f; float forgratio=0.0f; float Tadap_update=0.4f; int clear_stale_entries(codeBook &c); uchar background_Diff(uchar *p, codeBook &c, int numChannels, int *minMod, int *maxMod); int update_codebook_model(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels); int trainig_codebook(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels); int training_clear_stale_entries(codeBook &c); int det_update_codebook_cC(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels); int det_update_codebook_cD(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels, int numframe); int realtime_clear_stale_entries_cC(codeBook &c, int FrmNum); int realtime_clear_stale_entries_cD(codeBook &c, int FrmNum); int cD_to_cC(codeBook &d, codeBook &c, int FrmNum); uchar background_diff_realtime(uchar* p,codeBook& c,int numChannels,int* minMod,int* maxMod); void help() { printf( "***Keep the focus on the video windows, NOT the consol***\n" "INTERACTIVE PARAMETERS:\n" "\tESC,q,Q - quit the program\n" "\th - print this help\n" "\tp - pause toggle\n" "\ts - single step\n" "\tr - run mode (single step off)\n" "=== CODEBOOK PARAMS ===\n" "\ty,u,v- only adjust channel 0(y) or 1(u) or 2(v) respectively\n" "\ta - adjust all 3 channels at once\n" "\tb - adjust both 2 and 3 at once\n" "\ti,o - bump upper threshold up,down by 1\n" "\tk,l - bump lower threshold up,down by 1\n" "\tz,x - bump Fadd threshold up,down by 1\n" "\tn,m - bump Tavgstale threshold up,down by 1\n" "\t Fadd小更新快,Tavgstale大更新快\n" ); } int count_Segmentation(codeBook *c, IplImage *I, int numChannels, int *minMod, int *maxMod) { int count = 0,i; uchar *pColor; int imageLen = I->width * I->height; //GET BASELINE NUMBER OF FG PIXELS FOR Iraw pColor = (uchar *)((I)->imageData); for(i=0; i<imageLen; i++) { if(background_Diff(pColor, c[i], numChannels, minMod, maxMod)) count++; pColor += 3; } fgcount=count; return(fgcount); } void connected_Components(IplImage *mask, int poly1_hull0, float perimScale, int *num, CvRect *bbs, CvPoint *centers) { static CvMemStorage* mem_storage = NULL; static CvSeq* contours = NULL; //CLEAN UP RAW MASK cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_OPEN, CVCLOSE_ITR ); cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_CLOSE, CVCLOSE_ITR ); //FIND CONTOURS AROUND ONLY BIGGER REGIONS if( mem_storage==NULL ) mem_storage = cvCreateMemStorage(0); else cvClearMemStorage(mem_storage); CvContourScanner scanner = cvStartFindContours(mask,mem_storage,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE); CvSeq* c; int numCont = 0; while( (c = cvFindNextContour( scanner )) != NULL ) { double len = cvContourPerimeter( c ); double q = (mask->height + mask->width) /perimScale; //calculate perimeter len threshold if( len < q ) //Get rid of blob if it's perimeter is too small { cvSubstituteContour( scanner, NULL ); } else //Smooth it's edges if it's large enough { CvSeq* c_new; if(poly1_hull0) //Polygonal approximation of the segmentation c_new = cvApproxPoly(c,sizeof(CvContour),mem_storage,CV_POLY_APPROX_DP, CVCONTOUR_APPROX_LEVEL,0); else //Convex Hull of the segmentation c_new = cvConvexHull2(c,mem_storage,CV_CLOCKWISE,1); cvSubstituteContour( scanner, c_new ); numCont++; } } contours = cvEndFindContours( &scanner ); // PAINT THE FOUND REGIONS BACK INTO THE IMAGE cvZero( mask ); IplImage *maskTemp; //CALC CENTER OF MASS AND OR BOUNDING RECTANGLES if(num != NULL) { int N = *num, numFilled = 0, i=0; CvMoments moments; double M00, M01, M10; maskTemp = cvCloneImage(mask); for(i=0, c=contours; c != NULL; c = c->h_next,i++ ) { if(i < N) //Only process up to *num of them { cvDrawContours(maskTemp,c,CV_CVX_WHITE, CV_CVX_WHITE,-1,CV_FILLED,8); //Find the center of each contour if(centers != NULL) { cvMoments(maskTemp,&moments,1); M00 = cvGetSpatialMoment(&moments,0,0); M10 = cvGetSpatialMoment(&moments,1,0); M01 = cvGetSpatialMoment(&moments,0,1); centers[i].x = (int)(M10/M00); centers[i].y = (int)(M01/M00); } //Bounding rectangles around blobs if(bbs != NULL) { bbs[i] = cvBoundingRect(c); } cvZero(maskTemp); numFilled++; } //Draw filled contours into mask cvDrawContours(mask,c,CV_CVX_WHITE,CV_CVX_WHITE,-1,CV_FILLED,8); //draw to central mask } //end looping over contours *num = numFilled; cvReleaseImage( &maskTemp); } else { for( c=contours; c != NULL; c = c->h_next ) { cvDrawContours(mask,c,CV_CVX_WHITE, CV_CVX_BLACK,-1,CV_FILLED,8); } } } //////////////////////////// int main(int argc, char** argv) { IplImage* temp1 = NULL; IplImage* temp2 = NULL; IplImage* result = NULL; IplImage* result1 = NULL; IplImage* result2 = NULL; CvBGStatModel* bg_model = 0; CvBGStatModel* bg_model1=0; IplImage* rawImage = 0; IplImage* yuvImage = 0; IplImage* rawImage1 = 0; IplImage* pFrImg = 0; IplImage* pFrImg1= 0; IplImage* pFrImg2= 0; IplImage* ImaskCodeBookCC = 0; CvCapture* capture = 0; int c,n; maxMod[0] = 25; minMod[0] = 35; maxMod[1] = 8; minMod[1] = 8; maxMod[2] = 8; minMod[2] = 8; argc=2; argv[1]="intelligentroom_raw.avi"; if( argc > 2 ) { fprintf(stderr, "Usage: bkgrd [video_file_name]\n"); return -1; } if (argc ==1) if( !(capture = cvCaptureFromCAM(-1))) { fprintf(stderr, "Can not open camera.\n"); return -2; } if(argc == 2) if( !(capture = cvCaptureFromFile(argv[1]))) { fprintf(stderr, "Can not open video file %s\n", argv[1]); return -2; } bool pause = false; bool singlestep = false; if( capture ) { cvNamedWindow( "原视频序列图像", 1 ); cvNamedWindow("不实时更新的Codebook算法[本文]",1); cvNamedWindow("实时更新的Codebook算法[本文]",1); cvNamedWindow("基于MOG的方法[Chris Stauffer'2001]",1); cvNamedWindow("三帧差分", 1); cvNamedWindow("基于Bayes decision的方法[Liyuan Li'2003]", 1); cvMoveWindow("原视频序列图像", 0, 0); cvMoveWindow("不实时更新的Codebook算法[本文]", 360, 0); cvMoveWindow("实时更新的Codebook算法[本文]", 720, 350); cvMoveWindow("基于MOG的方法[Chris Stauffer'2001]", 0, 350); cvMoveWindow("三帧差分", 720, 0); cvMoveWindow("基于Bayes decision的方法[Liyuan Li'2003]",360, 350); int nFrmNum = -1; for(;;) { if(!pause) { rawImage = cvQueryFrame( capture ); ++nFrmNum; printf("第%d帧\n",nFrmNum); if(!rawImage) break; } if(singlestep) { pause = true; } if(0 == nFrmNum) { printf(". . . wait for it . . .\n"); temp1 = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 3); temp2 = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 3); result1 = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1); result2 = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1); result = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1); bg_model = cvCreateGaussianBGModel(rawImage); bg_model1 = cvCreateFGDStatModel(rawImage); rawImage1 = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 3 ); yuvImage = cvCloneImage(rawImage); pFrImg = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 ); pFrImg1 = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 ); pFrImg2 = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 ); ImaskCodeBookCC = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 ); imageLen = rawImage->width*rawImage->height; cA = new codeBook [imageLen]; cC = new codeBook [imageLen]; cD = new codeBook [imageLen]; for(int f = 0; f<imageLen; f++) { cA[f].numEntries = 0; cA[f].t = 0; cC[f].numEntries = 0; cC[f].t = 0; cD[f].numEntries = 0; cD[f].t = 0; } for(int nc=0; nc<nChannels;nc++) { cbBounds[nc] = 10; } ch[0] = true; ch[1] = true; ch[2] = true; } if( rawImage ) { if(!pause) { cvSmooth(rawImage, rawImage1, CV_GAUSSIAN,3,3); cvChangeDetection(temp1, temp2, result1); cvChangeDetection(rawImage1, temp1, result2); cvAnd(result1, result2, result, NULL); cvCopy(temp1,temp2, NULL); cvCopy(rawImage,temp1, NULL); cvUpdateBGStatModel( rawImage, bg_model ); cvUpdateBGStatModel( rawImage, bg_model1 ); } cvCvtColor( rawImage1, yuvImage, CV_BGR2YCrCb ); if( !pause && nFrmNum >= 1 && nFrmNum < T ) { pColor = (uchar *)((yuvImage)->imageData); for(int c=0; c<imageLen; c++) { update_codebook_model(pColor, cA[c],cbBounds,nChannels); trainig_codebook(pColor, cC[c],cbBounds,nChannels); pColor += 3; } } if( nFrmNum == T) { for(c=0; c<imageLen; c++) { clear_stale_entries(cA[c]); training_clear_stale_entries(cC[c]); } } if(nFrmNum > T) { pColor = (uchar *)((yuvImage)->imageData); uchar maskPixelCodeBook; uchar maskPixelCodeBook1; uchar maskPixelCodeBook2; uchar *pMask = (uchar *)((pFrImg)->imageData); uchar *pMask1 = (uchar *)((pFrImg1)->imageData); uchar *pMask2 = (uchar *)((pFrImg2)->imageData); for(int c=0; c<imageLen; c++) { //本文中不带自动背景更新的算法输出 maskPixelCodeBook1=background_Diff(pColor, cA[c],nChannels,minMod,maxMod); *pMask1++ = maskPixelCodeBook1; //本文中带自动背景更新的算法输出 if ( !pause && det_update_codebook_cC(pColor, cC[c],cbBounds,nChannels)) { det_update_codebook_cD(pColor, cD[c],cbBounds,nChannels, nFrmNum); realtime_clear_stale_entries_cD(cD[c], nFrmNum); cD_to_cC(cD[c], cC[c], (nFrmNum - T)/5); } else { realtime_clear_stale_entries_cC(cC[c], nFrmNum); } maskPixelCodeBook2=background_Diff(pColor, cC[c],nChannels,minMod,maxMod); *pMask2++ = maskPixelCodeBook2; pColor += 3; } cvCopy(pFrImg2,ImaskCodeBookCC); if(!pause) { count_Segmentation(cC,yuvImage,nChannels,minMod,maxMod); forgratio = (float) (fgcount)/ imageLen; } } bg_model1->foreground->origin=1; bg_model->foreground->origin=1; pFrImg->origin=1; pFrImg1->origin=1; pFrImg2->origin=1; ImaskCodeBookCC->origin=1; result->origin=1; //connected_Components(pFrImg1,1,40); //connected_Components(pFrImg2,1,40); cvShowImage("基于MOG的方法[Chris Stauffer'2001]", bg_model->foreground); cvShowImage( "原视频序列图像", rawImage ); cvShowImage("三帧差分", result); cvShowImage( "不实时更新的Codebook算法[本文]",pFrImg1); cvShowImage("实时更新的Codebook算法[本文]",pFrImg2); cvShowImage("基于Bayes decision的方法[Liyuan Li'2003]", bg_model1->foreground); c = cvWaitKey(1)&0xFF; //End processing on ESC, q or Q if(c == 27 || c == 'q' || c == 'Q') break; //Else check for user input switch(c) { case 'h': help(); break; case 'p': pause ^= 1; break; case 's': singlestep = 1; pause = false; break; case 'r': pause = false; singlestep = false; break; //CODEBOOK PARAMS case 'y': case '0': ch[0] = 1; ch[1] = 0; ch[2] = 0; printf("CodeBook YUV Channels active: "); for(n=0; n<nChannels; n++) printf("%d, ",ch[n]); printf("\n"); break; case 'u': case '1': ch[0] = 0; ch[1] = 1; ch[2] = 0; printf("CodeBook YUV Channels active: "); for(n=0; n<nChannels; n++) printf("%d, ",ch[n]); printf("\n"); break; case 'v': case '2': ch[0] = 0; ch[1] = 0; ch[2] = 1; printf("CodeBook YUV Channels active: "); for(n=0; n<nChannels; n++) printf("%d, ",ch[n]); printf("\n"); break; case 'a': //All case '3': ch[0] = 1; ch[1] = 1; ch[2] = 1; printf("CodeBook YUV Channels active: "); for(n=0; n<nChannels; n++) printf("%d, ",ch[n]); printf("\n"); break; case 'b': //both u and v together ch[0] = 0; ch[1] = 1; ch[2] = 1; printf("CodeBook YUV Channels active: "); for(n=0; n<nChannels; n++) printf("%d, ",ch[n]); printf("\n"); break; case 'z': printf(" Fadd加1 "); Fadd += 1; printf("Fadd=%.4d\n",Fadd); break; case 'x': printf(" Fadd减1 "); Fadd -= 1; printf("Fadd=%.4d\n",Fadd); break; case 'n': printf(" Tavgstale加1 "); Tavgstale += 1; printf("Tavgstale=%.4d\n",Tavgstale); break; case 'm': printf(" Tavgstale减1 "); Tavgstale -= 1; printf("Tavgstale=%.4d\n",Tavgstale); break; case 'i': //modify max classification bounds (max bound goes higher) for(n=0; n<nChannels; n++) { if(ch[n]) maxMod[n] += 1; printf("%.4d,",maxMod[n]); } printf(" CodeBook High Side\n"); break; case 'o': //modify max classification bounds (max bound goes lower) for(n=0; n<nChannels; n++) { if(ch[n]) maxMod[n] -= 1; printf("%.4d,",maxMod[n]); } printf(" CodeBook High Side\n"); break; case 'k': //modify min classification bounds (min bound goes lower) for(n=0; n<nChannels; n++) { if(ch[n]) minMod[n] += 1; printf("%.4d,",minMod[n]); } printf(" CodeBook Low Side\n"); break; case 'l': //modify min classification bounds (min bound goes higher) for(n=0; n<nChannels; n++) { if(ch[n]) minMod[n] -= 1; printf("%.4d,",minMod[n]); } printf(" CodeBook Low Side\n"); break; } } } cvReleaseCapture( &capture ); cvReleaseBGStatModel((CvBGStatModel**)&bg_model); cvReleaseBGStatModel((CvBGStatModel**)&bg_model1); cvDestroyWindow( "原视频序列图像" ); cvDestroyWindow( "不实时更新的Codebook算法[本文]"); cvDestroyWindow( "实时更新的Codebook算法[本文]"); cvDestroyWindow( "基于MOG的方法[Chris Stauffer'2001]"); cvDestroyWindow( "三帧差分" ); cvDestroyWindow( "基于Bayes decision的方法[Liyuan Li'2003]"); cvReleaseImage(&temp1); cvReleaseImage(&temp2); cvReleaseImage(&result); cvReleaseImage(&result1); cvReleaseImage(&result2); cvReleaseImage(&pFrImg); cvReleaseImage(&pFrImg1); cvReleaseImage(&pFrImg2); if(yuvImage) cvReleaseImage(&yuvImage); if(rawImage) cvReleaseImage(&rawImage); if(rawImage1) cvReleaseImage(&rawImage1); if(ImaskCodeBookCC) cvReleaseImage(&ImaskCodeBookCC); delete [] cA; delete [] cC; delete [] cD; } else { printf("\n\nDarn, Something wrong with the parameters\n\n"); help(); } return 0; } int clear_stale_entries(codeBook &c) { int staleThresh = c.t>>1; int *keep = new int [c.numEntries]; int keepCnt = 0; for(int i=0; i<c.numEntries; i++) { if(c.cb[i]->stale > staleThresh) keep[i] = 0; else { keep[i] = 1; keepCnt += 1; } } c.t = 0; code_element **foo = new code_element* [keepCnt]; int k=0; for(int ii=0; ii<c.numEntries; ii++) { if(keep[ii]) { foo[k] = c.cb[ii]; foo[k]->t_last_update = 0; k++; } } delete [] keep; delete [] c.cb; c.cb = foo; int numCleared = c.numEntries - keepCnt; c.numEntries = keepCnt; return(numCleared); } uchar background_Diff(uchar *p, codeBook &c, int numChannels, int *minMod, int *maxMod) { int matchChannel; int i; for(i=0; i<c.numEntries; i++) { matchChannel = 0; for(int n=0; n<numChannels; n++) { if((c.cb[i]->min[n] - minMod[n] <= *(p+n)) && (*(p+n) <= c.cb[i]->max[n] + maxMod[n])) { matchChannel++; } else { break; } } if(matchChannel == numChannels) { break; } } if(i >= c.numEntries) return(255); return(0); } int update_codebook_model(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels) { if(c.numEntries == 0) c.t = 0; c.t += 1; unsigned int high[3],low[3]; int matchChannel; float avg[3]; for(int i=0; i<c.numEntries; i++) { matchChannel = 0; for(int n=0; n<numChannels; n++) { if((c.cb[i]->learnLow[n] <= *(p+n)) && (*(p+n) <= c.cb[i]->learnHigh[n])) { matchChannel++; } } if(matchChannel == numChannels) { for(int n=0; n<numChannels; n++) { avg[n] = (c.cb[i]->f * c.cb[i]->avg[n] + *(p+n))/(c.cb[i]->f + 1); c.cb[i]->avg[n] = avg[n]; if(c.cb[i]->max[n] < *(p+n)) { c.cb[i]->max[n] = *(p+n); } else if(c.cb[i]->min[n] > *(p+n)) { c.cb[i]->min[n] = *(p+n); } } c.cb[i]->f += 1; c.cb[i]->t_last_update = c.t; int negRun = c.t - c.cb[i]->t_last_update; if(c.cb[i]->stale < negRun) c.cb[i]->stale = negRun; break; } } for(int n=0; n<numChannels; n++) { high[n] = *(p+n)+*(cbBounds+n); if(high[n] > 255) high[n] = 255; low[n] = *(p+n)-*(cbBounds+n); if(low[n] < 0) low[n] = 0; } if(i == c.numEntries) { code_element **foo = new code_element* [c.numEntries+1]; for(int ii=0; ii<c.numEntries; ii++) { foo[ii] = c.cb[ii]; } foo[c.numEntries] = new code_element; if(c.numEntries) delete [] c.cb; c.cb = foo; for(int n=0; n<numChannels; n++) { c.cb[c.numEntries]->avg[n] = *(p+n); c.cb[c.numEntries]->max[n] = *(p+n); c.cb[c.numEntries]->min[n] = *(p+n); c.cb[c.numEntries]->learnHigh[n] = high[n]; c.cb[c.numEntries]->learnLow[n] = low[n]; } c.cb[c.numEntries]->f = 1; c.cb[c.numEntries]->stale = c.t-1; c.cb[c.numEntries]->t_first_update = c.t; c.cb[c.numEntries]->t_last_update = c.t; c.numEntries += 1; } for(int s=0; s<c.numEntries; s++) { int negRun = c.t - c.cb[s]->t_last_update + c.cb[s]->t_first_update -1 ; if(c.cb[s]->stale < negRun) c.cb[s]->stale = negRun; } for(n=0; n<numChannels; n++) { if(c.cb[i]->learnHigh[n] < high[n]) c.cb[i]->learnHigh[n] += 1; if(c.cb[i]->learnLow[n] > low[n]) c.cb[i]->learnLow[n] -= 1; } return(i); } int trainig_codebook(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels) { if(c.numEntries == 0) c.t = 0; c.t += 1; unsigned int high[3],low[3]; int matchChannel; float avg[3]; for(int i=0; i<c.numEntries; i++) { matchChannel = 0; for(int n=0; n<numChannels; n++) { if((c.cb[i]->learnLow[n] <= *(p+n)) && (*(p+n) <= c.cb[i]->learnHigh[n])) { matchChannel++; } } if(matchChannel == numChannels) { for(int n=0; n<numChannels; n++) { avg[n] = (c.cb[i]->f * c.cb[i]->avg[n] + *(p+n))/(c.cb[i]->f + 1); c.cb[i]->avg[n] = avg[n]; if(c.cb[i]->max[n] < *(p+n)) { c.cb[i]->max[n] = *(p+n); } else if(c.cb[i]->min[n] > *(p+n)) { c.cb[i]->min[n] = *(p+n); } } c.cb[i]->f += 1; c.cb[i]->t_last_update = c.t; int negRun = c.t - c.cb[i]->t_last_update; if(c.cb[i]->stale < negRun) c.cb[i]->stale = negRun; if (i!=0) { code_element **fo = new code_element* [c.numEntries]; fo[0] = c.cb[i]; for(int h=0; h<i; h++) { fo[h+1] = c.cb[h]; } for(int h=i+1; h<c.numEntries; h++) { fo[h] = c.cb[h]; } if(c.numEntries) delete [] c.cb; c.cb = fo; } break; } } for(int n=0; n<numChannels; n++) { high[n] = *(p+n)+*(cbBounds+n); if(high[n] > 255) high[n] = 255; low[n] = *(p+n)-*(cbBounds+n); if(low[n] < 0) low[n] = 0; } if(i == c.numEntries) { code_element **foo = new code_element* [c.numEntries+1]; for(int ii=0; ii<c.numEntries; ii++) { foo[ii] = c.cb[ii]; } foo[c.numEntries] = new code_element; if(c.numEntries) delete [] c.cb; c.cb = foo; for(n=0; n<numChannels; n++) { c.cb[c.numEntries]->avg[n] = *(p+n); c.cb[c.numEntries]->max[n] = *(p+n); c.cb[c.numEntries]->min[n] = *(p+n); c.cb[c.numEntries]->learnHigh[n] = high[n]; c.cb[c.numEntries]->learnLow[n] = low[n]; } c.cb[c.numEntries]->f = 1; c.cb[c.numEntries]->stale = c.t-1; c.cb[c.numEntries]->t_first_update = c.t; c.cb[c.numEntries]->t_last_update = c.t; c.numEntries += 1; } for(int s=0; s<c.numEntries; s++) { int negRun = c.t - c.cb[s]->t_last_update + c.cb[s]->t_first_update -1 ; if(c.cb[s]->stale < negRun) c.cb[s]->stale = negRun; } for(int n=0; n<numChannels; n++) { if(c.cb[i]->learnHigh[n] < high[n]) c.cb[i]->learnHigh[n] += 1; if(c.cb[i]->learnLow[n] > low[n]) c.cb[i]->learnLow[n] -= 1; } return(i); } int training_clear_stale_entries(codeBook &c) { int staleThresh = c.t>>1; int *keep = new int [c.numEntries]; int keepCnt = 0; for(int i=0; i<c.numEntries; i++) { if(c.cb[i]->stale > staleThresh) keep[i] = 0; else { keep[i] = 1; keepCnt += 1; } } code_element **foo = new code_element* [keepCnt]; int k=0; for(int ii=0; ii<c.numEntries; ii++) { if(keep[ii]) { foo[k] = c.cb[ii]; k++; } } delete [] keep; delete [] c.cb; c.cb = foo; int numCleared = c.numEntries - keepCnt; c.numEntries = keepCnt; return(numCleared); } int det_update_codebook_cC(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels) { c.t += 1; int matchChannel; float avg[3]; int learnLow[3],learnHigh[3]; for(int i=0; i<c.numEntries; i++) { matchChannel = 0; for(int n=0; n<numChannels; n++) { if (forgratio >= Tadap_update ) { learnLow[n] = c.cb[i]->learnLow[n] * (1 - gamma); c.cb[i]->learnLow[n] = learnLow[n]; learnHigh[n] = c.cb[i]->learnHigh[n] * (1 + gamma); c.cb[i]->learnHigh[n] = learnHigh[n]; } if((c.cb[i]->learnLow[n] <= *(p+n)) && (*(p+n) <= c.cb[i]->learnHigh[n])) { matchChannel++; } } if(matchChannel == numChannels) { if (forgratio >= Tadap_update ) { for(int n=0; n<numChannels; n++) { avg[n] = (1 - beta) * c.cb[i]->avg[n] + *(p+n) * beta; c.cb[i]->avg[n] = avg[n]; if(c.cb[i]->max[n] < *(p+n)) { c.cb[i]->max[n] = *(p+n); } else if(c.cb[i]->min[n] > *(p+n)) { c.cb[i]->min[n] = *(p+n); } } } else { for(int n=0; n<numChannels; n++) { avg[n] = (c.cb[i]->f * c.cb[i]->avg[n] + *(p+n))/(c.cb[i]->f + 1); c.cb[i]->avg[n] = avg[n]; if(c.cb[i]->max[n] < *(p+n)) { c.cb[i]->max[n] = *(p+n); } else if(c.cb[i]->min[n] > *(p+n)) { c.cb[i]->min[n] = *(p+n); } } } int negRun = c.t - c.cb[i]->t_last_update; if(c.cb[i]->stale < negRun) c.cb[i]->stale = negRun; c.cb[i]->t_last_update = c.t; c.cb[i]->f += 1; break; } } if( i == c.numEntries) return (i); return(0); } int det_update_codebook_cD(uchar* p,codeBook& c,unsigned* cbBounds,int numChannels, int numframe) { if(c.numEntries == 0) c.t = numframe -1; c.t += 1; unsigned int high[3],low[3]; int matchChannel; float avg[3]; int learnLow[3],learnHigh[3]; for(int i=0; i<c.numEntries; i++) { matchChannel = 0; for(int n=0; n<numChannels; n++) { if (forgratio >= Tadap_update ) { learnLow[n] = c.cb[i]->learnLow[n] * (1 - gamma); c.cb[i]->learnLow[n] = learnLow[n]; learnHigh[n] = c.cb[i]->learnHigh[n] * (1 + gamma); c.cb[i]->learnHigh[n] = learnHigh[n]; } if((c.cb[i]->learnLow[n] <= *(p+n)) && (*(p+n) <= c.cb[i]->learnHigh[n])) { matchChannel++; } } if(matchChannel == numChannels) { if (forgratio >= Tadap_update ) { for(int n=0; n<numChannels; n++) { avg[n] = (1 - beta) * c.cb[i]->avg[n] + *(p+n) * beta; c.cb[i]->avg[n] = avg[n]; if(c.cb[i]->max[n] < *(p+n)) { c.cb[i]->max[n] = *(p+n); } else if(c.cb[i]->min[n] > *(p+n)) { c.cb[i]->min[n] = *(p+n); } } } else { for(int n=0; n<numChannels; n++) { avg[n] = (c.cb[i]->f * c.cb[i]->avg[n] + *(p+n))/(c.cb[i]->f + 1); c.cb[i]->avg[n] = avg[n]; if(c.cb[i]->max[n] < *(p+n)) { c.cb[i]->max[n] = *(p+n); } else if(c.cb[i]->min[n] > *(p+n)) { c.cb[i]->min[n] = *(p+n); } } } int negRun = c.t - c.cb[i]->t_last_update; if(c.cb[i]->stale < negRun) c.cb[i]->stale = negRun; c.cb[i]->f += 1; c.cb[i]->t_last_update = c.t; break; } } for(int n=0; n<numChannels; n++) { high[n] = *(p+n)+*(cbBounds+n); if(high[n] > 255) high[n] = 255; low[n] = *(p+n)-*(cbBounds+n); if(low[n] < 0) low[n] = 0; } if(i == c.numEntries) { code_element **foo = new code_element* [c.numEntries+1]; for(int ii=0; ii<c.numEntries; ii++) { foo[ii] = c.cb[ii]; } foo[c.numEntries] = new code_element; if(c.numEntries) delete [] c.cb; c.cb = foo; for(int n=0; n<numChannels; n++) { c.cb[c.numEntries]->avg[n] = *(p+n); c.cb[c.numEntries]->max[n] = *(p+n); c.cb[c.numEntries]->min[n] = *(p+n); c.cb[c.numEntries]->learnHigh[n] = high[n]; c.cb[c.numEntries]->learnLow[n] = low[n]; } c.cb[c.numEntries]->f = 1; c.cb[c.numEntries]->stale = 0; c.cb[c.numEntries]->t_first_update = c.t; c.cb[c.numEntries]->t_last_update = c.t; c.numEntries += 1; } for(int s=0; s<c.numEntries; s++) { int negRun = c.t - c.cb[s]->t_last_update; if(c.cb[s]->stale < negRun) c.cb[s]->stale = negRun; } for(int n=0; n<numChannels; n++) { if(c.cb[i]->learnHigh[n] < high[n]) c.cb[i]->learnHigh[n] += 1; if(c.cb[i]->learnLow[n] > low[n]) c.cb[i]->learnLow[n] -= 1; } return(i); } int realtime_clear_stale_entries_cC(codeBook &c, int FrmNum) { int staleThresh = FrmNum/2; int *keep = new int [c.numEntries]; int keepCnt = 0; for(int i=0; i<c.numEntries; i++) { if(c.cb[i]->stale > staleThresh) keep[i] = 0; else { keep[i] = 1; keepCnt += 1; } } c.t = 0; code_element **foo = new code_element* [keepCnt]; int k=0; for(int ii=0; ii<c.numEntries; ii++) { if(keep[ii]) { foo[k] = c.cb[ii]; k++; } } delete [] keep; delete [] c.cb; c.cb = foo; int numCleared = c.numEntries - keepCnt; c.numEntries = keepCnt; return(numCleared); } int realtime_clear_stale_entries_cD(codeBook &c, int FrmNum) { int *keep = new int [c.numEntries]; int keepCnt = 0; for(int i=0; i<c.numEntries; i++) { if(c.cb[i]->f <=Fd && c.cb[i]->stale >=Tavgstale_cD) keep[i] = 0; else { keep[i] = 1; keepCnt += 1; } } code_element **foo = new code_element* [keepCnt]; int k=0; for(int ii=0; ii<c.numEntries; ii++) { if(keep[ii]) { foo[k] = c.cb[ii]; k++; } } delete [] keep; delete [] c.cb; c.cb = foo; int numCleared = c.numEntries - keepCnt; c.numEntries = keepCnt; return(numCleared); } int cD_to_cC(codeBook &d, codeBook &c, int FrmNum) { int *keep_d = new int [d.numEntries]; int keepCnt = 0; for(int i=0; i<d.numEntries; i++) { int convertThresh = (FrmNum - T)/d.cb[i]->f; if(d.cb[i]->f >=Fadd && convertThresh <=Tavgstale) { keep_d[i] = 0; } else { keep_d[i] = 1; keepCnt += 1; } } code_element **foo_d = new code_element* [keepCnt]; int k=0; for(int ii=0; ii<d.numEntries; ii++) { if(keep_d[ii]) { foo_d[k] = d.cb[ii]; k++; } else { code_element **foo_c = new code_element* [c.numEntries+1]; for(int jj=0; jj<c.numEntries; jj++) { foo_c[jj] = c.cb[jj]; } foo_c[c.numEntries] = new code_element; delete [] c.cb; c.cb = foo_c; c.cb[c.numEntries] = d.cb[ii]; c.numEntries +=1; } } delete [] keep_d; delete [] d.cb; d.cb = foo_d; int numconverted = d.numEntries - keepCnt; d.numEntries = keepCnt; return(numconverted); } ``` 下面是报错: 1>------ 已启动生成: 项目: Realtime_online_cb_det, 配置: Debug x64 ------ 1> Realtime_online_cb_det.cpp 1>Realtime_online_cb_det.cpp(185): error C2065: “CvBGStatModel”: 未声明的标识符 1>Realtime_online_cb_det.cpp(185): error C2065: “bg_model”: 未声明的标识符 1>Realtime_online_cb_det.cpp(186): error C2065: “CvBGStatModel”: 未声明的标识符 1>Realtime_online_cb_det.cpp(186): error C2065: “bg_model1”: 未声明的标识符 1>Realtime_online_cb_det.cpp(271): error C2065: “bg_model”: 未声明的标识符 1>Realtime_online_cb_det.cpp(271): error C3861: “cvCreateGaussianBGModel”: 找不到标识符 1>Realtime_online_cb_det.cpp(272): error C2065: “bg_model1”: 未声明的标识符 1>Realtime_online_cb_det.cpp(272): error C3861: “cvCreateFGDStatModel”: 找不到标识符 1>Realtime_online_cb_det.cpp(308): error C3861: “cvChangeDetection”: 找不到标识符 1>Realtime_online_cb_det.cpp(309): error C3861: “cvChangeDetection”: 找不到标识符 1>Realtime_online_cb_det.cpp(315): error C2065: “bg_model”: 未声明的标识符 1>Realtime_online_cb_det.cpp(315): error C3861: “cvUpdateBGStatModel”: 找不到标识符 1>Realtime_online_cb_det.cpp(316): error C2065: “bg_model1”: 未声明的标识符 1>Realtime_online_cb_det.cpp(316): error C3861: “cvUpdateBGStatModel”: 找不到标识符 1>Realtime_online_cb_det.cpp(381): error C2065: “bg_model1”: 未声明的标识符 1>Realtime_online_cb_det.cpp(381): error C2227: “->foreground”的左边必须指向类/结构/联合/泛型类型 1> 类型是“unknown-type” 1>Realtime_online_cb_det.cpp(381): error C2227: “->origin”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(382): error C2065: “bg_model”: 未声明的标识符 1>Realtime_online_cb_det.cpp(382): error C2227: “->foreground”的左边必须指向类/结构/联合/泛型类型 1> 类型是“unknown-type” 1>Realtime_online_cb_det.cpp(382): error C2227: “->origin”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(391): error C2065: “bg_model”: 未声明的标识符 1>Realtime_online_cb_det.cpp(391): error C2227: “->foreground”的左边必须指向类/结构/联合/泛型类型 1> 类型是“unknown-type” 1>Realtime_online_cb_det.cpp(391): error C2660: “cvShowImage”: 函数不接受 1 个参数 1>Realtime_online_cb_det.cpp(396): error C2065: “bg_model1”: 未声明的标识符 1>Realtime_online_cb_det.cpp(396): error C2227: “->foreground”的左边必须指向类/结构/联合/泛型类型 1> 类型是“unknown-type” 1>Realtime_online_cb_det.cpp(396): error C2660: “cvShowImage”: 函数不接受 1 个参数 1>Realtime_online_cb_det.cpp(529): error C2065: “CvBGStatModel”: 未声明的标识符 1>Realtime_online_cb_det.cpp(529): error C2059: 语法错误:“)” 1>Realtime_online_cb_det.cpp(530): error C2065: “CvBGStatModel”: 未声明的标识符 1>Realtime_online_cb_det.cpp(530): error C2059: 语法错误:“)” 1>Realtime_online_cb_det.cpp(529): error C3861: “cvReleaseBGStatModel”: 找不到标识符 1>Realtime_online_cb_det.cpp(530): error C3861: “cvReleaseBGStatModel”: 找不到标识符 1>Realtime_online_cb_det.cpp(677): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(712): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(714): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(714): error C2227: “->learnHigh”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(714): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(715): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(715): error C2227: “->learnLow”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(715): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(717): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(789): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(799): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(801): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(802): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(803): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(804): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(805): error C2065: “n”: 未声明的标识符 1>Realtime_online_cb_det.cpp(824): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(824): error C2227: “->learnHigh”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(825): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(825): error C2227: “->learnLow”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(827): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(880): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 1>Realtime_online_cb_det.cpp(882): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 1>Realtime_online_cb_det.cpp(938): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(962): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 1>Realtime_online_cb_det.cpp(964): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 1>Realtime_online_cb_det.cpp(1024): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(1061): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(1061): error C2227: “->learnHigh”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(1062): error C2065: “i”: 未声明的标识符 1>Realtime_online_cb_det.cpp(1062): error C2227: “->learnLow”的左边必须指向类/结构/联合/泛型类型 1>Realtime_online_cb_det.cpp(1064): error C2065: “i”: 未声明的标识符 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
130 个相见恨晚的超实用网站,一次性分享出来
文末没有公众号,只求 点赞 + 关注 搞学习 知乎:www.zhihu.com 大学资源网:http://www.dxzy163.com/ 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:stu
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱  极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件,   选择安装到U盘(按照操作无需更改) 三、重启进入pe系统   1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12)     选择需要启
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
java源码分析 Arrays.asList()与Collections.unmodifiableList()
举个栗子 本章示例代码来自java编程思想——17.4.1未获支持的操作——Unsupported类。 import java.util.*; public class Unsupported { static void test(String msg, List&lt;String&gt; list) { System.out.println("--- " + msg
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
Java学习笔记(七十二)—— Cookie
概述 会话技术: 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器发送资源请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie,把数据存储到客户端 服务器端会话技术:Session,把数据存储到服务器端 Cookie 概念:客户端会话技术,将数据存储到客户端 快速入门: 使用步骤: 创建C
程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
蓝桥杯知识点汇总:基础知识和常用算法
文章目录JAVA基础语法:算法竞赛常用的JAVA API:基础算法待更: 此系列包含蓝桥杯所考察的绝大部分知识点,一共有基础语法,常用API,基础算法和数据结构,和往年真题四部分,虽然语言以JAVA为主,但算法部分是相通的,C++组的小伙伴也可以看哦。所有文章的链接都会在此公布,还有很多没有更新,会持续更新,如果大佬发现文章有错误的地方请指正,我会十分感谢。另外,有什么问题可私信我~ JAVA基础
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
实现简单的轮播图(单张图片、多张图片)
前言 刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点。ps:下面出现的都是直接闪动,没有滑动效果的轮播图。 单张图片的替换 原理 1.将几张图片叠在一起,通过改变"display:block"和"display:none"这两个属性实现替换。 (前提:在css中给所有图片加上display:none属性) 2.不用将图片叠在一起,将一个div当做"窗口",通过"of
强烈推荐10本程序员在家读的书
很遗憾,这个鼠年春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 显示当前目录 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mk
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药
Java与Python学习通法(1)和(2)序言和编程语言发展史怎么学
大家好,我是 jacky 朱元禄,很高兴跟大家一起学习 《Java与Python学习通法系列》。 首先,说一下,我为什么要录这个课; 我们都已经知道Java 和 Python的视频教程和书籍,可以说是非常非常多了,那我录制本系列课的意义是什么呢? (1)课程特色一:我想告诉大家学习编程语言是有捷径的,这个捷径就是 理解技术背后的“哲学逻辑”,或者说是“人文逻辑”,相信你听完 jack
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
阿里架构师花近十年时间整理出来的Java核心知识pdf(Java岗)
由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容! 整理了一份Java核心知识点。覆盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。       欢迎大家加入java学习交流社区  点击加入   可获取文中文档       小编推荐:     
Python基础知识点梳理
python基础知识点梳理 摘要: 本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象,也算是对于学习这门语言的一个总结与回顾。python的详细语法介绍可以查看官方编程手册,也有一些在线网站对python语法进行了比较全面的介绍,比如菜鸟教程: python3 教程|菜鸟教程 为了方便聚焦知识点,本文涉及的操作实例并不多,想学好一门语言关键还得自己多编码多实践。 python语
2020年2月全国程序员工资统计,平均工资13716元
趋势 2020年2月,中国大陆程序员平均工资13716元,比上个月增加。具体趋势如图: 各主要程序员城市工资变化 城市 北京,上海,深圳,杭州,广州四地的工资最高。 city 平均工资 最低工资 中位数 最高工资 招聘人数 百分比 北京 18098 3750 15000 45000 20529 9.53% 深圳 16903 5750 15000 37500 30941 14
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
为什么说程序员做外包没前途?
之前做过不到3个月的外包,2020的第一天就被释放了,2019年还剩1天,我从外包公司离职了。我就谈谈我个人的看法吧。首先我们定义一下什么是有前途 稳定的工作环境 不错的收入 能够在项目中不断提升自己的技能(ps:非技术上的认知也算) 找下家的时候能找到一份工资更高的工作 如果你目前还年轻,但高不成低不就,只有外包offer,那请往下看。 外包公司你应该
基于Python的人脸自动戴口罩系统
目录 1、项目背景 2、页面设计 3、器官识别 4、退出系统 1、项目背景 2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩、酒精、消毒液奇货可居。 抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示: 本系统的实现原理是借助 Dlib模块的Landmark人脸68个关键点检测库轻松识别出人脸五官
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
jQuery实现高仿QQ音乐
几个实现的效果看视频吧: bandicam 2020-02-05 16-28-20-127 动图很是不清楚 github地址奉上:https://github.com/tangmusenLiu/Large-warehouse https://github.com/tangmu
《请停止无效的努力》读书笔记
一、如何快速找到你的天赋优势 1、人的价值定位 1.1、冰山模型 &nbsp; &nbsp; &nbsp; &nbsp; 你能创造多大的价值,离不开三大内在因素: 第一要素:知识和技能,位于冰山显露的部分,是非常显性,容易展示出来的; 第二要素:能力,比如:思考能力、人际交往能力等,需要通过仔细的行为观察才能看出,位于冰山的中间部分; 第三要素:天赋。包括潜在能力、性格特质、动机、价值观等
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
python核心编程:入门Python编程的8个实践性建议
前言 我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑踩过的雷总结出来的,现在在这里分享一下给大家,因为很多伙伴是接触Python编程入门不久,也希望大家少走弯路,多少有些地方可以给大家借鉴。 文章目录1. 项目文件事先做好归档2. 永远不要手动修改源数据并且做好备份3. 做好路径的正确配置4. 代码必要的地方做好备注
动画:《大前端吊打面试官系列》 之原生 JavaScript 精华篇
......更新日志 文中所有修改或补充内容,会在日志中实时更新。 2020/01/7 开始决定写近十几万字前端面试系列,规划整个系列目录提纲。 2020/01/8 写完部分“面试官到底考察你什么”内容。 2020/01/9 继续完善”面试官到底考察你什么“内容。 2020/01/11 开始写准备简历部分。 2020/01/13 完善面试前的准备内容。 2020/01/14 对面试
网络爬虫——Urllib模块实战项目(含代码)爬取你的第一个网站
Urllib模块实战项目什么是Urllib模块Urllib实例1(将内容爬到内存中)Urllib实例2(将内容爬到电脑硬盘中)Urllib实例3(浏览器伪装)Urllib实例4(用户代理池) 之前给大家分享了正则表达式和XPath表达式的内容,有了以上基础今天来给大家带来了网络爬虫实战课程,教大家爬取第一个网站 什么是Urllib模块 Urllib是Python提供的一个用于操作URL的模块,这个
相关热词 c#导入fbx c#中屏蔽键盘某个键 c#正态概率密度 c#和数据库登陆界面设计 c# 高斯消去法 c# codedom c#读取cad文件文本 c# 控制全局鼠标移动 c# temp 目录 bytes初始化 c#
立即提问