用opencv3调用摄像头对摄像头的图像进行保存,需要键控

各位大神,我现在需要用opencv保存摄像头中的图像,但是需要键控选择保存自己想要的图片。
我用的是VS2013

1个回答

你的意思是不是抓取瞬间的帧图。

qq_31183395
socor 是的,自己可以选择什么时候抓图
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
用opencv调用摄像头,然后根据视频图像变化,获得摄像头运动轨迹可以怎么做?
用opencv调用摄像头,然后根据视频图像变化,获得摄像头运动轨迹可以怎么做?最好有程序
opencv调用摄像头进行矩形检测,release模式下无法出现摄像头画面?
在debug模式下可以正常运行 release下也编译通过 ``` #include<opencv2/opencv.hpp> using namespace cv; using namespace std; double getAngle(Point pt1, Point pt2, Point pt0) { double dx1 = pt1.x - pt0.x; double dy1 = pt1.y - pt0.y; double dx2 = pt2.x - pt0.x; double dy2 = pt2.y - pt0.y; return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10); } bool isYellowSquare(Mat image_H, vector<Point> square) { int pointX[4]; int pointY[4]; for (int i = 0; i < 4; i++) { pointX[i] = square[i].x; pointY[i] = square[i].y; } for (int i = 0; i < 4; i++) { for (int j = 0; j < 3 - i; j++) { if (pointX[j] > pointX[j + 1]) { int tx = pointX[j]; pointX[j] = pointX[j + 1]; pointX[j + 1] = tx; } if (pointY[j] > pointY[j + 1]) { int ty = pointY[j]; pointY[j] = pointY[j + 1]; pointY[j + 1] = ty; } } } Rect rect(pointX[0], pointY[0], pointX[3] - pointX[0] + 1, pointY[3] - pointY[0] + 1); Mat roImg(image_H, rect); int count = 0; for (int i = 0; i<roImg.rows; i++) { uchar* data = roImg.ptr<uchar>(i); for (int j = 0; j<roImg.cols; j++) { if (data[j] == 0) count += 1; } } if (count>0.8*((roImg.cols*roImg.rows)/2 + (pointX[2]-pointX[1]+1)*(pointY[2]-pointY[1]+1)/2)) return true; else return false; } bool getSquarePts(const Mat image, vector<vector<Point> >& squares) { bool isGetSquares = false; squares.clear(); //数组清空 Mat pyr, gray0, gray, grayImg; Mat imageHSV, image_H; cvtColor(image, grayImg, CV_RGB2GRAY); cvtColor(image, imageHSV, CV_BGR2HSV); //将image转到HSV空间 image_H.create(imageHSV.size(), imageHSV.depth()); //定义与imageHSV同尺寸和深度的图像image_H int ch1[] = { 0, 0 }; mixChannels(&imageHSV, 1, &image_H, 1, ch1, 1); //将imageHSV的H层复制到image_H for (int i = 0; i < image_H.rows; i++) { uchar* data = image_H.ptr<uchar>(i); for (int j = 0; j < image_H.cols; j++) { if (data[j] >= 10 && data[j] <= 40) data[j] = 0; else data[j] = 255; } } pyrDown(grayImg, pyr, Size(image.cols / 2, image.rows / 2)); pyrUp(pyr, gray0, image.size()); Canny(gray0, gray, 0, 50, 3); dilate(gray, gray, Mat(), Point(-1, -1)); for (int i = 0; i < gray.rows; i++) { uchar* data1 = gray.ptr<uchar>(i); uchar* data2 = image_H.ptr<uchar>(i); for (int j = 0; j < gray.cols; j++) { if (data1[j] == 255) data2[j] = 255; } } vector<vector<Point> > contours; findContours(image_H, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); //对image_H进行处理,将检测出的每个轮廓(相互独立)以点集(拐点)的形式存储到contours中 vector<Point> approx; //存储矩形4个顶点的坐标的数组 for (size_t i = 0; i < contours.size(); i++) { approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);//输出封闭的多边形顶点点集 //判断是否为四边形等条件 if (approx.size() == 4 && fabs(contourArea(Mat(approx))) > 1000 && isContourConvex(Mat(approx))) { double maxCosine = 0; for (int j = 2; j < 5; j++) { double cosine = fabs(getAngle(approx[j % 4], approx[j - 2], approx[j - 1])); //计算夹角余弦值 maxCosine = MAX(maxCosine, cosine); } //如果三个夹角余弦值都小于0.3则说明是矩形,并存储矩形 if (maxCosine < 0.3&&isYellowSquare(image_H, approx)) { squares.push_back(approx); isGetSquares = true; } } } /*if (squares.size()>1) { vector<Point>center; vector<int>item; int d; for (int i = 0; i<squares.size(); i++) { Point point; point.x = (squares[i][0].x + squares[i][2].x) / 2; point.y = (squares[i][0].y + squares[i][2].y) / 2; center.push_back(point); } for (int i = 0; i<center.size() - 1; i++) { for (int j = i + 1; j<center.size(); j++) { d = (center[i].x - center[j].x)*(center[i].x - center[j].x) + (center[i].y - center[j].y)*(center[i].y - center[j].y); if (d<100) { item.push_back(i); break; } } } int n = 0; for (int j = 0; j<item.size(); j++) { squares.erase(squares.begin() + item[j]-n); ++n; } }*/ return isGetSquares; } //旋转图像中点的函数 Point getPointAffinedPos(Point src, Point center, double angle,double scale) { Point dst; int x = src.x - center.x; int y = src.y - center.y; dst.x = cvRound(x * cos(angle) + y * sin(angle) + center.x); dst.y = cvRound(-x * sin(angle) + y * cos(angle) + center.y); dst.x = (dst.x - center.x)*scale + center.x; dst.y = (dst.y - center.y)*scale + center.y; return dst; } //裁切 void cutImg(const Mat image, vector<vector<Point> > squares, vector<Mat>& rectResult) { for (int i_ = 0; i_ < squares.size(); i_++) { vector<Point>longside; //存储矩形长边的两个顶点 longside.push_back(squares[i_][1]); longside.push_back(squares[i_][2]); Mat rot(2, 3, CV_32FC1); //旋转矩阵 Mat rotMat = Mat::zeros(image.size(), image.type()); //定义旋转后的矩阵 Point center = Point(rotMat.cols / 2, rotMat.rows / 2); //旋转中心 double angle = atan((longside[0].y - longside[1].y) / ((longside[0].x - longside[1].x) + 0.00000001)) * 180 / CV_PI; //旋转角度 double scale = image.rows / sqrt(image.cols*image.cols + image.rows*image.rows); //缩放参数 rot = getRotationMatrix2D(center, angle, scale); //获得旋转矩阵 warpAffine(image, rotMat, rot, image.size()); //旋转并缩放图像 vector<Point>resultPoint; //存储旋转后矩形的4个顶点 Point point; for (int i = 0; i < 4; i++) { point = getPointAffinedPos(squares[i_][i], Point(image.cols / 2, image.rows / 2), angle*CV_PI / 180, scale); resultPoint.push_back(point); //存储顶点 } //获得矩形的bounding box(近似于矩形本身) int maxX, minX, maxY, minY; maxX = maxY = 0; minX = resultPoint[0].x; minY = resultPoint[0].y; for (int i = 0; i < resultPoint.size(); i++) { maxX = resultPoint[i].x > maxX ? resultPoint[i].x : maxX; minX = resultPoint[i].x < minX ? resultPoint[i].x : minX; maxY = resultPoint[i].y > maxY ? resultPoint[i].y : maxY; minY = resultPoint[i].y < minY ? resultPoint[i].y : minY; } //裁剪矩形并存储到新图像中 Rect rect(minX, minY, maxX - minX + 1, maxY - minY + 1); Mat temp(rotMat, rect); /*Mat temp_hsv; cvtColor(temp, temp_hsv, COLOR_BGR2HSV); Mat temp_H; temp_H.create(temp_hsv.size(), temp_hsv.depth()); int ch1[] = { 0, 0 }; mixChannels(&temp_hsv, 1, &temp_H, 1, ch1, 1); Mat Image(temp_H.size(), CV_8U); for (int i = 0; i<Image.rows; i++) { uchar* data = Image.ptr<uchar>(i); uchar* data1 = temp_H.ptr<uchar>(i); for (int j = 0; j<Image.cols; j++) { if (data1[j]>32) data[j] = 0; else data[j] = 255; } }*/ rectResult.push_back(temp); } cout << rectResult.size() << endl; } // the function draws all the squares in the image void drawSquares(Mat& image, const vector<vector<Point> > squares) { int maxX, minX, maxY, minY; for (int i = 0; i < squares.size(); i++) { maxX = maxY = 0; minX = squares[i][0].x; minY = squares[i][0].y; for (int j = 0; j < 4; j++) { maxX = maxX > squares[i][j].x ? maxX : squares[i][j].x; minX = minX < squares[i][j].x ? minX : squares[i][j].x; maxY = maxY > squares[i][j].y ? maxY : squares[i][j].y; minY = minY < squares[i][j].y ? minY : squares[i][j].y; } Point point1, point2; point1.x = minX; point1.y = minY; point2.x = maxX; point2.y = maxY; rectangle(image, point1, point2, (0, 0, 255), 2, 8, 0); //画矩形 } } bool findSquares(Mat& image, vector<Mat>& resultImage,vector<Point>& center) { bool isFindSquares = false; vector<vector<Point> > squarePts; isFindSquares = getSquarePts(image, squarePts); if (isFindSquares) cutImg(image, squarePts, resultImage); else cout << "can't find squares!" << endl; drawSquares(image, squarePts); for (int i = 0; i < squarePts.size(); i++) { Point point; point.x = (squarePts[i][0].x + squarePts[i][2].x) / 2; point.y = (squarePts[i][0].y + squarePts[i][2].y) / 2; center.push_back(point); } waitKey(20); return isFindSquares; int main() { VideoCapture capture(0); Mat image; if (!capture.isOpened()) { cout << "can not open"; cin.get(); return 0; } vector<vector<Point>>squares; vector<Mat>cutImage; while (true) { capture >> image; getSquarePts(image, squares); cutImg(image, squares, cutImage); drawSquares(image, squares); imshow("检测结果", image); waitKey(30); } return 0; } } ```
Linux下使用opencv打开摄像头后无法彻底关闭摄像头
Linux下使用opencv调用cvCreateCameraCapture打开摄像头后,使用cvReleaseCapture无法彻底关闭摄像头,摄像头上的灯还亮着。只有退出程序才能关闭。如果不退出的话,再次调用cvCreateCameraCapture后就无法获取图像,出现 VIDIOC_STREAMON: 错误的文件描述符。初次接触opencv,不是很了解。
vs+opencv调用同一usb口的两路摄像头
买了一个双目摄像头,只有一个usb口那种,支持两路设备识别和输出,我单独调用任何一路都能输出图像,但是同时调用两路显示时,第二路总是打不开,有没有哪个大佬遇到过相似的问题?怎么解决的呢? 附上我的代码: #include<opencv2/opencv.hpp> #include<cv.h> using namespace cv; using namespace std; int main() { //【1】从摄像头读入视频 VideoCapture capture(2); if(!capture.isOpened()) {cout<< "cannot open the camera.";cin.get();return -1;} VideoCapture capture1(1); if (!capture1.isOpened()) { cout << "cannot open the camera1."; cin.get(); return -1; } while (1) { Mat frame; //定义一个Mat变量,用于存储每一帧的图像 Mat frame1; //定义一个Mat变量,用于存储每一帧的图像 capture >> frame; //读取当前帧 if (frame.empty()) { printf("--(!) No captured frame -- Break!"); //break; } else { imshow("原图", frame); //显示当前帧 } capture1 >> frame1; //读取当前帧 if (frame1.empty()) { printf("--(!) No captured frame1 -- Break\r\n"); //break; } else { imshow("原图1", frame1); //显示当前帧 } waitKey(30); //延时30ms } 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 for android的实时图像处理的项目。我发现用opencv调用摄像头读取的图片尺寸大小在不同的设备上面不一样。请教一下:有没有什么方法能够让摄像头在不同设备上读取的图片尺寸大小一样?
IAR如何添加opencv库?
我想用K60芯片对7040摄像头采集的图像进行处理,所用K60开发环境为IAR7.2,现在想调用opencv库进行图像处理,但是不知道该开发环境怎么添加opencv库,有谁知道的嘛?
求问能不能只用普通摄像头和unity基础api进行最基本的图像识别?
最近在研究基于unity的人脸或图像识别,发现unity想要进行识别的话,必须借助外设例如红外摄像头或者kinect,或者用软件插件比如opencv,vuforia之类的。 我想问有没有只用最普通的网络摄像头加unity自带的api能实现最简单的识别,比如人在摄像头前面晃一下,或者动作大一些的话unity能接到信号进行截图之类的,完全不用考虑精度,只是想看看有没有这个功能。 我查了一下最近2017.2.0f3版本的api,好像只有调用外部摄像头的,调用完了就没别的控制方式了。 如果实在没有的话,要达到我说的那种识别交互效果的最简单的方式是什么,大家有没有相关经验?
Android开发中如何用OpenCV调用Camera2返回的数据进行处理?
最近正学习开发一个小项目,需要用到OpenCV对摄像头采集到的图像进行处理。**因为处理过程中要求对曝光时间和增益进行精准控制**,所以只能使用Camera2进行摄像头控制。 网上这部分资料比较少,**请问如何调取图像数据进行处理?** ``` private void createCameraPreviewSession() { try { SurfaceTexture texture = mTextureView.getSurfaceTexture(); assert texture != null; // We configure the size of default buffer to be the size of camera preview we want. texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); // This is the output Surface we need to start preview. Surface surface = new Surface(texture); // We set up a CaptureRequest.Builder with the output Surface. mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mPreviewRequestBuilder.addTarget(surface); // Here, we create a CameraCaptureSession for camera preview. mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { // The camera is already closed if (null == mCameraDevice) { return; } // When the session is ready, we start displaying the preview. mCaptureSession = cameraCaptureSession; try { // Auto focus should be continuous for camera preview. mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); // Flash is automatically enabled when necessary. setAutoFlash(mPreviewRequestBuilder); // Finally, we start displaying the camera preview. mPreviewRequest = mPreviewRequestBuilder.build(); mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed( @NonNull CameraCaptureSession cameraCaptureSession) { showToast("Failed"); } }, null ); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 有一部分资料说是从SurfaceTexture中获取,不知可否能行?希望能提供详细链接或者Demo,感激不尽!!!
树莓派摄像头无法打开咋办,用raspistill会返回failed to open vchiq instance,感谢大家帮忙看看
我想用树莓派调用摄像头,已经把摄像头使能开了,也加了bcm2835-v4l2,但是用raspistill调用会返回*failed to open vchiq instance 网上也没找到什么解决方案,能试的都试了下,实在不知道该怎么办了。因为之后还要用opencv做图像处理,挺急的,希望哪位大神能看看哪些地方可能有问题。dev目录下自然是没有video0的。摄像头换了新的也还是这样,断电接的摄像头,应该不会烧。 ![图片说明](https://img-ask.csdn.net/upload/201907/06/1562392901_627831.jpg)
OpenCV打开摄像头问题。。。。
OpenCV2.4.13+VS2012+win10程序 void CCountDlg::OnOpencam() { if(pCapture) cvReleaseCapture(&pCapture); pCapture = cvCaptureFromCAM(0); m_num=0; m_in=0; m_out=0; UpdateData(FALSE); // 调用数人数主程序 SetTimer(1,TIMERCNT,NULL); } 用opencam按钮打开可以打开按钮,但是不显示图像,有木有知道为什么的,请指教~
opencv用boundingrect找最大区域时崩溃
代码的功能是调用摄像头,然后找出视频帧中的红色区域,再找到其中最大的区域作为ROI。 用笔记本集成的摄像头的时候可以正常跑。 换成usb外接摄像头,编译连接都没问题,就是run的时候崩溃了 //#include "stdafx.h" #include "opencv2/opencv.hpp" #include <cv.h> #include <iostream> using namespace std; using namespace cv; //漫水填充 void fillHole(const Mat srcBw, Mat &dstBw) { Size m_Size = srcBw.size(); Mat Temp = Mat::zeros(m_Size.height + 2, m_Size.width + 2, srcBw.type());//延展图像 srcBw.copyTo(Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1))); cv::floodFill(Temp, Point(0, 0), Scalar(255,255,255)); //cv::floodFill(Temp, Point(30, 29), Scalar(255, 0, 0), 0, Scalar(10, 10, 10), Scalar(10, 10, 10)); Mat cutImg;//裁剪延展的图像 Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)).copyTo(cutImg); dstBw = srcBw | (~cutImg); } int main(int argc, char** argv) { //定义扫描图像的循环变量 int i = 0; int j = 0; //通过摄像头采集视频 VideoCapture capture(0); //读取视频. //VideoCapture capture("E:/weixian.mp4"); //视频总帧数 //long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT); //num是一个计数的flag. int num = 1; while (1) //while (num <= totalFrameNumber) { //IplImage* frame; Mat frame1, frame; //将捕获图像存入frame变量 capture >> frame1; blur(frame1, frame1, Size(7, 7)); //缩放倍数 double fScale = 0.5; //目标图像尺寸 CvSize czSize; czSize.width = frame1.cols*fScale; czSize.height = frame1.rows*fScale; cv::resize(frame1, frame, cv::Size(czSize.width, czSize.height), (0, 0), (0, 0), cv::INTER_LINEAR); cv::Mat rgbImage = frame, hsvImage; //转换到hsv空间 cv::cvtColor(rgbImage, hsvImage, cv::COLOR_BGR2HSV); //为了获取图像的尺寸 //这里把图像类型转换 IplImage* tempImage = &IplImage(hsvImage); IplImage* extractionImage = &IplImage(hsvImage); IplImage* reversionImage = &IplImage(hsvImage); IplImage* grayImage = &IplImage(hsvImage); IplImage* binaryImage = &IplImage(hsvImage); //显示两个空间下的图像 imshow("RGB", rgbImage); //imshow("HSV", hsvImage); for (i = 0; i < tempImage->height; i++) { for (j = 0; j < tempImage->width; j++) { //获取像素点为(j, i)点的HSV的值 CvScalar s_hsv = cvGet2D(tempImage, i, j); /* opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180) S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80), V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。 */ CvScalar s; if (!(((s_hsv.val[0]>0) && (s_hsv.val[0]<8)) || (s_hsv.val[0]>178) && (s_hsv.val[0]<180))) { s.val[0] = 0; s.val[1] = 0; s.val[2] = 0; cvSet2D(tempImage, i, j, s); } //else这小段是自己加的,如果是红色,就置为白色. else { s.val[0] = 180; s.val[1] = 30; s.val[2] = 255; cvSet2D(tempImage, i, j, s); } } } //提取红色分量 cvConvert(tempImage, extractionImage); //cvNamedWindow("Extraction"); //cvShowImage("Extraction", extractionImage); //颜色空间变换回RGB cvCvtColor(extractionImage, reversionImage, cv::COLOR_HSV2BGR); //cvNamedWindow("Reversion"); //cvShowImage("Reversion", reversionImage); //这里如果转灰度,会出现内存泄漏. //由于前边定义每个图像都用的取址运算符 //因为grayImge指向的是hsvImage的地址,而后者一直在变 //所以此处gray也一直在变 //RGB图像转灰度图 //cvCvtColor(reversionImage, grayImage, cv::COLOR_BGR2GRAY); //cvNamedWindow("Gray"); //cvShowImage("Gray", grayImage); //灰度图转二值图 cvThreshold(grayImage, binaryImage, 100, 255, CV_THRESH_BINARY); //cvThreshold(reversionImage, binaryImage, 150, 255, CV_THRESH_BINARY); //cvNamedWindow("Binary"); //cvShowImage("Binary", binaryImage); //5*5正方形,8位uchar型,全1结构元素 cv::Mat element5(5, 5, CV_8U, cv::Scalar(1)); cv::Mat closed,opened,temp,final,cimage; //cv::vector<vector<cv::Point>> contours(10000); temp = Mat(binaryImage); //高级形态学运算函数 cv::morphologyEx(temp, opened, cv::MORPH_CLOSE, element5); cv::morphologyEx(temp, closed, cv::MORPH_CLOSE, element5); //cvNamedWindow("Opened"); //imshow("Opened", opened); //cvNamedWindow("Closed"); //imshow("Closed", closed); fillHole(closed, final); cvNamedWindow("Final"); imshow("Final", final); Canny(final, cimage, 150, 250); //cvNamedWindow("Canny"); //imshow("Canny", cimage); cv::vector<vector<cv::Point>> contours; vector<Vec4i> hierarchy; cv::findContours(cimage, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE,Point()); //cv::findContours(cimage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); // 寻找最大连通域 double maxArea = 0; vector<cv::Point> maxContour; for (size_t i = 0; i < contours.size(); i++) { double area = cv::contourArea(contours[i]); if (area > maxArea) { maxArea = area; maxContour = contours[i]; } //cout << maxArea << endl; } //cout << maxArea << endl; //cout << contours.size() << endl; //cout << i << endl; //cout << maxContour << endl; // 将轮廓转为矩形框 cv::Rect maxRect = cv::boundingRect(maxContour); // 显示连通域 cv::Mat result1, result2; final.copyTo(result1); final.copyTo(result2); for (size_t i = 0; i < contours.size(); i++) { cv::Rect r = cv::boundingRect(contours[i]); cv::rectangle(result1, r, cv::Scalar(255)); } //cv::imshow("all regions", result1); //cv::waitKey(); cv::rectangle(result2, maxRect, cv::Scalar(0, 255, 0), 3); cv::imshow("largest region", result2); if (maxArea>8000) { cv::imshow("largest region", result2); } /* */ waitKey(20); //视频帧数加1. num = num + 1; } return 0; } ``` ``` ![图片说明](https://img-ask.csdn.net/upload/201808/16/1534430156_429439.png) ![图片说明](https://img-ask.csdn.net/upload/201808/16/1534430084_178855.png) 好像是boundingrect那里出错了,但是为什么集成摄像头就可以呢?请教各位
小白求助!!!关于利用Zbar进行二维码扫描程序的问题
构建openCV3.4.0+zbar 64位+VS2015的环境 (zbar貌似只支持32位系统因此我又自己找了64位的库) 这个程序就是利用调用摄像头扫描二维码,然后通过数学计算测量摄像头与二维码的实时距离 是按照原博主的这篇文章https://zhou-yuxin.github.io/articles/2017/%E5%9F%BA%E4%BA%8E%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%9A%84%E5%AE%A4%E5%86%85%E5%AE%9A%E4%BD%8D%E6%8A%80%E6%9C%AF%EF%BC%88%E4%BA%8C%EF%BC%89%E2%80%94%E2%80%94%E5%AE%9E%E7%8E%B0/index.html参考的 又请了师兄将其中openCV老版本的语句换成了我这个版本的 本来应该按照原博的示例是这样的 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576057370_636530.jpg) 但是我运行过后变成了这样 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576057402_728485.png) 打印出来的三个变量不对 而且都是乱码 我上网搜索也没有发现相关资料和问题 真的很着急 求各位大神指教 是不是我的ZBAR安装的有问题? 真的快急哭了 求救!!! 代码如下 QRLocation.h #ifndef QRLOCATION_H #define QRLOCATION_H /* 二维码的内容必须符合格式: QRLocation,<qrSize> 其中<qrSize>是一个实数,表示二维码边长 */ #include <opencv2/opencv.hpp> #include <opencv2/videoio.hpp> #include <zbar.h> #include <opencv/highgui.h> //二维码倾斜阈值 #define QRLOCATION_INCLINATION_THRESHOLD 0.1 //调试窗口标题 #define QRLOCATION_DEBUGUI_TITLE "debugui" //二维码位姿 typedef struct QRPose { //二维码中心所在铅垂线与O点构成的平面和Z轴形成的夹角 double a; //二维码所在平面与X轴构成的夹角 double b; //二维码中心到XOY平面的距离 double z; } QRPose_t; //二维码定位算法 class QRLocation { public: //初始化,第一个参数为摄像头编号,第二个参数为摄像头上下视角,第三个参数为是否开启调试窗口 bool init(int webcamIndex, double hViewAngle, bool debugUI); //获取二维码位姿 bool getQRPose(QRPose_t* qrPose); //销毁 bool destroy(); private: //摄像头 cv::VideoCapture capture; //摄像头上下视角 double hViewAngle; //是否开启调试窗口 bool debugUI; //灰度图 cv::Mat grayFrame; //图片扫描器 zbar::ImageScanner scanner; private: //计算位姿(格式合法性判断) bool getQRPose(zbar::Image::SymbolIterator symbol, QRPose_t* qrPose); //计算位姿(算法) bool getQRPose(zbar::Image::SymbolIterator symbol, double qrSize, QRPose_t* qrPose); }; #endif QRLocation.cpp #include <iostream> #include <opencv/highgui.h> #include "QRLocation.h" #include <string.h> #include <stdio.h> using namespace std; using namespace zbar; bool QRLocation::init(int webcamIndex, double hViewAngle, bool debugUI) { //打开摄像头 capture.open(webcamIndex); //摄像头不存在 if (!capture.isOpened()) { printf("camera open error \n"); return false; } //printf("point 2 \n"); this->hViewAngle = hViewAngle; this->debugUI = debugUI; //grayFrame=0; //配置zbar图片扫描器 scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1); //printf("point 3 \n"); //如果开启调试,则创建窗口,名称为“debugui”,自动调整大小 if (debugUI) { cv::namedWindow(QRLOCATION_DEBUGUI_TITLE, CV_WINDOW_AUTOSIZE); } //printf("point 4 \n"); return 1; } bool QRLocation::getQRPose(QRPose_t* qrPose) { //从摄像头中抓取一帧 cv::Mat frame; capture.read(frame);; //图像为空 if (frame.empty()) { printf("read frame is empty!\n"); return false; } //printf("point 6 \n"); //如果灰度图没有创建,就创建一个和原图一样大小的灰度图(8位色深,单通道) //if (grayFrame.empty()) { grayFrame = cv::Mat(frame.size(), IPL_DEPTH_8U, 1); //} //原图转灰度图 //cv::cvtColor(frame, grayFrame, cv::COLOR_BGR2GRAY); cvtColor(frame, grayFrame, CV_RGB2GRAY); //printf("point 9 \n"); //如果开启调试,则显示灰度图 if (debugUI) { cv::imshow(QRLOCATION_DEBUGUI_TITLE, grayFrame); char c = cv::waitKey(30); } //printf("point 8 \n"); //创建zbar图像 uchar* data = frame.data; void *new_data = static_cast<void *>(data); Image image(frame.size().width, frame.size().height, "Y800", new_data, frame.size().width*frame.size().height); //printf("point 7 \n"); //扫描图像,识别二维码,获取个数 int symbolCount = scanner.scan(image); //获取第一个二维码 Image::SymbolIterator symbol = image.symbol_begin(); //遍历所有识别出来的二维码 while (symbolCount--) { //能够识别 if (getQRPose(symbol, qrPose)) return true; //下一个二维码 ++symbol; } return false; } bool QRLocation::getQRPose(Image::SymbolIterator symbol, QRPose_t* qrPose) { //首先得是一个二维码 if (symbol->get_type_name() != "QR-Code") printf("this is shit"); //获取内容 char data[128]; strncpy_s(data, symbol->get_data().c_str(), sizeof(data) - 1); data[sizeof(data) - 1] = 0; //内容得是以“QRLocation,”开头 if (strncmp(data, "QRLocation,", 11) != 0) return false; //获取二维码边长 double qrSize = 0; sscanf_s(data + 11, "%lf", &qrSize); if (qrSize == 0) return false; //计算位姿 return getQRPose(symbol, qrSize, qrPose); } bool QRLocation::getQRPose(Image::SymbolIterator symbol, double qrSize, QRPose_t* qrPose) { //获得四个点的坐标 double x0 = symbol->get_location_x(0); double y0 = symbol->get_location_y(0); double x1 = symbol->get_location_x(1); double y1 = symbol->get_location_y(1); double x2 = symbol->get_location_x(2); double y2 = symbol->get_location_y(2); double x3 = symbol->get_location_x(3); double y3 = symbol->get_location_y(3); //左边沿纵向差 double leftH = y1 - y0; //右边沿纵向差 double rightH = y2 - y3; //必须保证0点高于1点,3点高于2点 if (leftH<0 || rightH<0) return false; //左边沿横向差 double leftW = abs(x0 - x1); //右边沿横向差 double rightW = abs(x2 - x3); //不能太倾斜 if (max(leftW / leftH, rightW / rightH)>QRLOCATION_INCLINATION_THRESHOLD) return false; //上下视角一半的正切值,因为一直要用,所以先计算出来 double tanHalfView = tan(hViewAngle / 2); double leftLen = sqrt(leftH*leftH + leftW*leftW); double rightLen = sqrt(rightH*rightH + rightW*rightW); //左边沿的深度 double leftZ = grayFrame.size().height*qrSize / tanHalfView / 2 / leftLen; //右边沿的深度 double rightZ = grayFrame.size().height*qrSize / tanHalfView / 2 / rightLen; //得到中心点的深度 double z = (leftZ + rightZ) / 2; //计算b的正弦值 double sinB = (leftZ - rightZ) / qrSize; if (sinB>1) return false; //得到b double b = asin(sinB); //两条对角线的系数和偏移 double k1 = (y2 - y0) / (x2 - x0); double b1 = (x2*y0 - x0*y2) / (x2 - x0); double k2 = (y3 - y1) / (x3 - x1); double b2 = (x3*y1 - x1*y3) / (x3 - x1); //两条对角线交点的X坐标 double crossX = -(b1 - b2) / (k1 - k2); //计算a的正切值 double tanA = tanHalfView*(2 * crossX - grayFrame.size().width) / grayFrame.size().width; //得到a double a = atan(tanA); qrPose->a = a; qrPose->b = b; qrPose->z = z; return true; } //bool QRLocation::destroy() //{ //释放灰度图 //cvReleaseImage(&grayFrame); //销毁窗口 //cvDestroyWindow(QRLOCATION_DEBUGUI_TITLE); //释放内存 //cvReleaseCapture(&capture); //} QRLocationTest.cpp #include "QRLocation.h" #include <stdio.h> int main(int argc, char* argv[]) { //printf("point 1 \n"); QRLocation qrLoc; if (!qrLoc.init(0, 0.60, true)) { return 1; } //printf("point 5 \n"); QRPose_t pose; while (true) { if (qrLoc.getQRPose(&pose)) { double aInDegree = pose.a * 180 / 3.1415; double bInDegree = pose.b * 180 / 3.1415; printf("a=%.2lf,b=%.2lf,z=%.2lf\n", aInDegree, bInDegree, pose.z); } } }
关于打开双目摄像头报错
部分的代码如下: int main(int argc, const char** argv) { VideoCapture cap(1); cap.set(CV_CAP_PROP_FRAME_WIDTH,2560); cap.set(CV_CAP_PROP_FRAME_HEIGHT,720); if(!cap.open(1)) { return -1; } Mat frame,frame_L,frame_R; cap>>frame; Mat grayImage; double Scale=0.5; Size dsize=Size(frame.cols*Scale,frame.rows*Scale); Mat imagedst=Mat(dsize,CV_32S); resize(frame,imagedst,dsize); while(1) { cap>>frame; resize(frame,imagedst,dsize); frame_L = imagedst( Rect(0, 0, 640, 360)); namedWindow("video_L",1); imshow("video_L",frame_L); frame_R = imagedst(Rect(640, 0, 640, 360)); namedWindow("video_R",1); imshow("video_R",frame_R); if(waitKey(30)>=0) break; } cap.release(); return 0; } 单步调试可以显示某一帧的两个图像,但是不适用单步调试(按下F5)程序报错, 错误如下: OpenCV Error: Assertion failed (ssize.area() > 0) in cv::resize, file ..\..\..\..\opencv\modules\imgproc\src\imgwarp.cpp, line 1834 请各位知道的大牛帮助下小弟。
MFC对话框初始化时新建线程,调用OPENCV显示视频文件的问题。
我用VS2010新建一个MFC对话框。 新建3个全局变量:IplImage *img;CvCapture* capture; int m_flag=0。(m_flag用来退出线程。) 在对话框上插入一个图片控件IDC_PTC。 在对话框的初始化函数中插入如下代码 ``` capture=cvCreateCameraCapture(0); if(!capture) { MessageBox(_T("打开摄像头失败!")); } else { m_flag=1; cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 800); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 800); cvSetCaptureProperty(capture, CV_CAP_PROP_FPS, 5); HANDLE hThread; hThread=CreateThread(NULL,0,FunProc1,(LPVOID)this,0,NULL); CloseHandle(hThread); } ``` 线程函数如下: ``` DWORD WINAPI CtestDlg::FunProc1(LPVOID lp) { CtestDlg* dlg=(CtestDlg*)lp; CWnd* wnd=(CWnd*)lp; CClientDC dc(wnd&&m_flag); RECT rect; (wnd->GetDlgItem(IDC_PTC))->GetWindowRect(&rect); wnd->ScreenToClient(&rect); img=cvQueryFrame(capture); CvvImage cvImg; while(img&&m_flag) { cvImg.CopyOf(img); cvImg.DrawToHDC(dc,&rect); img=cvQueryFrame(capture); } cvImg.Destroy(); return 1; } ``` 那么问题来了: 这样在线程函数开头插入断点"调试运行"对话框显示时就可以看到相机实时采集图像显示在图片控件内。 但是如果直接点“开始执行(不调试)”,目前所知有2种情况: 1、用USB接口相机,图片控件上不显示相机采集的视频。 2、用笔记本自带相机,图片控件上显示相机采集的视频。 这是为什么?还有下面2个问题如下: 3、“调试运行”对话框按正常流程退出。“开始执行(不调试)”对话框时不时的不正常退出(任务管理器可以看到程序在后台运行)。 4、如果把创建线程的函数放入到一个按钮里面,那么2个相机采集的视频都可以正常显示在图片控件里面。 望大神解答一下上面的疑问,我是自己没事自学的,没什么水平。
OpenCV2.4.13+VS2012+win10程序
void CCountDlg::OnOpencam() { if(pCapture) cvReleaseCapture(&pCapture); pCapture = cvCaptureFromCAM(0); //cvWaitKey(200); m_num=0; m_in=0; m_out=0; UpdateData(FALSE); // 调用数人数主程序 SetTimer(1,TIMERCNT,NULL); } 用opencam按钮打开usb摄像头时只显示一下处理后的图像,然后程序停止运行; 打开系统自带摄像头是无法读取到图像,
opencv中HSI读取视频不能成功,代码运行成功,结果出不来。
>#include<opencv2/opencv.hpp> //#include<iostream> #include<math.h> #include<vector> using namespace std; using namespace cv; //-------------------------- RGB 模型 转换为 HSI 模型--------------------// int main(){ VideoCapture capture(0); printf("摄像头调用成功"); if(!capture.isOpened()) { return -1; } //Mat special; while(1){ Mat BGRImage,HSIImage,temp; //存储每一帧的图像 capture >>BGRImage ; //读取当前帧 if (!BGRImage.empty()) //判断当前帧是否捕捉成功 **这步很重要 imshow("name", BGRImage); //若当前帧捕捉成功,显示 else cout<<"can not "; //temp = BGRImage.clone(); Mat fhsi; //Mat BGRImage = imread("2.jpg"); HSIImage = Mat(Size(BGRImage.cols, BGRImage.rows), CV_8UC3); imshow("video",BGRImage); //namedWindow(",LeafBGRImage",CV_WINDOW_AUTOSIZE); vector <Mat> channels; split(HSIImage, channels); Mat Hvalue = channels.at(0); Mat Svalue = channels.at(1); Mat Ivalue = channels.at(2); for (int i = 0; i < BGRImage.rows; ++i) for (int j = 0; j < BGRImage.cols; ++j) { double H, S, I; int Bvalue = BGRImage.at<Vec3b>(i, j)(0); int Gvalue = BGRImage.at<Vec3b>(i, j)(1); int Rvalue = BGRImage.at<Vec3b>(i, j)(2); //求Theta =acos((((Rvalue - Gvalue) + (Rvalue - Bvalue)) / 2) / sqrt(pow((Rvalue - Gvalue), 2) + (Rvalue - Bvalue)*(Gvalue - Bvalue))); double numerator = ((Rvalue - Gvalue) + (Rvalue - Bvalue)) / 2; double denominator = sqrt(pow((double)(Rvalue - Gvalue), 2) + (Rvalue - Bvalue)*(Gvalue - Bvalue)); if (denominator == 0) H = 0; else{ double Theta = acos(numerator / denominator) * 180 / 3.14; if (Bvalue <= Gvalue) H = Theta; else H = 360 - Theta; } Hvalue.at<uchar>(i, j) = (int)(H * 255 / 360); //为了显示将[0~360]映射到[0~255] //求S = 1-3*min(Bvalue,Gvalue,Rvalue)/(Rvalue+Gvalue+Bvalue); int minvalue = Bvalue; if (minvalue > Gvalue) minvalue = Gvalue; if (minvalue > Rvalue) minvalue = Rvalue; numerator = 3 * minvalue; denominator = Rvalue + Gvalue + Bvalue; if (denominator == 0) S = 0; else{ S = 1 - numerator / denominator; } Svalue.at<uchar>(i, j) = (int)(S * 255);//为了显示将[0~1]映射到[0~255] I= (Rvalue + Gvalue + Bvalue) / 3; Ivalue.at<uchar>(i, j) = (int)(I); } merge(channels, HSIImage); namedWindow("HSI",CV_WINDOW_AUTOSIZE); imshow("HSI", HSIImage); } waitKey(0); return 0; } ![图片说明](https://img-ask.csdn.net/upload/201711/24/1511533779_608704.png)
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
深深的码丨Java HashMap 透析
HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自AbstractMap,三者均实现Map接口 **HashTab:**同步哈希表,不支持null键或值,因为同步导致性能影响,很少被使用 **HashMap:**应用较多的非同步哈希表,支持null键或值,是键值对...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
相关热词 c# 图片上传 c# gdi 占用内存 c#中遍历字典 c#控制台模拟dos c# 斜率 最小二乘法 c#进程延迟 c# mysql完整项目 c# grid 总行数 c# web浏览器插件 c# xml 生成xsd
立即提问