关于c++的opencv里vector<vector<Mat>>里对Mat赋值的问题

主函数里声明一个变量

vector<vector<cv::Mat>> map(bottom[0]->num(), vector<cv::Mat>(bottom[0]->channels(), cv::Mat(bottom[0]->height(), bottom[0]->width(), CV_32S, cv::Scalar(0))));
BlobToMat(*bottom[0], map);


template <typename Dtype>
void BlobToMat(const Blob<Dtype>& blob, vector<vector<cv::Mat>>& map) {
  CHECK_EQ(blob.num(),1)<<"Phase:TEST, batch_size should be 1.";
  const int batch_size = blob.num();
  const int channel = blob.channels();
  const int height = blob.height();
  const int width = blob.width();
  for(int i=0; i<batch_size; ++i)  
    for(int j=0; j<channel; ++j) 
      for(int m=0; m<height; ++m)
        for(int n=0; n<width; ++n) {
          map[i][j].at<int>(m,n) = (int)(blob.cpu_data()[((i*channel+j)*height+m)*width+n]);
        }
    for(int i=0; i<batch_size; ++i)
      for(int j=0; j<channel; ++j) {
        cv::imshow("test", map[i][j]*255*255);
        cv::waitKey(0);
      }         
}

之后的结果与预期不符,channel循环的时候,第i个Mat的值会变成第i+1个Mat的值?很奇怪?正确方法该如何使用呢?
我得到的结果如图:
图片说明
图片说明
图片说明
所有图像都变成一样的了,即最后一个Mat的图像,这个问题困惑我很久了,这是为什么呢?

1个回答

xuexigua44
xuexigua44 确实是浅拷贝造成的问题
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于c++的opencv里vector<vector<Mat>>里对Mat赋值的问题
主函数里声明一个变量 ``` vector<vector<cv::Mat>> map(bottom[0]->num(), vector<cv::Mat>(bottom[0]->channels(), cv::Mat(bottom[0]->height(), bottom[0]->width(), CV_32S, cv::Scalar(0)))); BlobToMat(*bottom[0], map); template <typename Dtype> void BlobToMat(const Blob<Dtype>& blob, vector<vector<cv::Mat>>& map) { CHECK_EQ(blob.num(),1)<<"Phase:TEST, batch_size should be 1."; const int batch_size = blob.num(); const int channel = blob.channels(); const int height = blob.height(); const int width = blob.width(); for(int i=0; i<batch_size; ++i) for(int j=0; j<channel; ++j) for(int m=0; m<height; ++m) for(int n=0; n<width; ++n) { map[i][j].at<int>(m,n) = (int)(blob.cpu_data()[((i*channel+j)*height+m)*width+n]); } for(int i=0; i<batch_size; ++i) for(int j=0; j<channel; ++j) { cv::imshow("test", map[i][j]*255*255); cv::waitKey(0); } } ``` 之后的结果与预期不符,channel循环的时候,第i个Mat的值会变成第i+1个Mat的值?很奇怪?正确方法该如何使用呢? 我得到的结果如图: ![图片说明](https://img-ask.csdn.net/upload/201908/09/1565359773_763374.jpg) ![图片说明](https://img-ask.csdn.net/upload/201908/09/1565359787_40538.jpg) ![图片说明](https://img-ask.csdn.net/upload/201908/09/1565359793_214817.jpg) 所有图像都变成一样的了,即最后一个Mat的图像,这个问题困惑我很久了,这是为什么呢?
Opencv里vector<Mat>的问题
比如说有个子函数(这应该是子函数吧),开头如下 ``` vector<Mat>CalculateIntegralHOG(Mat& srcMat) ``` 1.vector《Mat》表示Mat类函数吧,为什么要把它放在vector里? 2.Mat和Mat&的区别是什么?
OpenCV中對vector<Mat>添加return返還
如題,小弟最近在做有關opencv的程式,是關於找出鏡頭畫面之藍色區域並且計算邊長與旋轉角度,由於有時跳出 vector subscript out of range 這段程式碼,後來發現是因為如果攝像機沒有出現目標設定之藍色區域,此時vector會超出他的範圍,如果我想添加一段判斷式在vector<Mat> channels; 這邊,判斷當vector範圍超出時返還,則該判別式 該如何寫? 小弟試過幾次結果並不成功,還請各位前輩指教一下,以下放是片段程式碼 int main() { VideoCapture cap(0); if (!cap.isOpened()) { cout << " Camera Has Been Opened !" << endl; return -1; } Mat frame; while (1) //儲存WebCam上面之畫面 { cap >> frame; imwrite("C:/Navigation/WebCam_Image.jpg", frame); if (frame.empty()) { cout << " Error Writing the Image !" << endl; return -4; } line(frame, Point(0, 240), Point(640, 240), Scalar(0, 255, 0), 1, CV_AA); line(frame, Point(320, 0), Point(320, 480), Scalar(0, 255, 0), 1, CV_AA); imshow("WebCam", frame); if (waitKey(1) == 27) { break; } } //Blue //留住 Mat srcImg, midImg, dstImg; srcImg = imread("C:/Navigation/WebCam_Image.jpg"); //C:/Lock Mouse/WebCam_Image.jpg //C:/Navigation/5.png Mat xianshi = srcImg.clone(); Mat redChannel, greenChannel, blueChannel; //namedWindow("【Original】", WINDOW_AUTOSIZE); //imshow("【Original】", srcImg); //0.灰階 Mat grayImg; vector<Mat> channels; split(srcImg, channels); //cvtColor(srcImg,grayImg,COLOR_BGR2GRAY); grayImg = channels.at(0); //對藍色區域取灰階圖 redChannel = channels.at(2); greenChannel = channels.at(1); blueChannel = channels.at(0); //namedWindow("【Blue 灰度圖】", WINDOW_AUTOSIZE); //imshow("【Blue 灰度圖】", grayImg); //1.均值濾波 blur(grayImg, grayImg, Size(20, 20), Point(-1, -1)); //namedWindow("【均值濾波後】", WINDOW_NORMAL); //imshow("【均值濾波後】", grayImg); //2.轉化為二值圖 Mat midImg1 = grayImg.clone(); int rowNumber = midImg1.rows; int colNumber = midImg1.cols; for (int i = 0; i < rowNumber; i++) //僅限定天藍色區域 { uchar* data = midImg1.ptr<uchar>(i); //取第i行的首地址 uchar* redData = redChannel.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) { if (data[j] > BIN_DIV&&redData[j] < BIN_DIV * 2 / 3) data[j] = 255; else data[j] = 0; } } namedWindow("【Blue 二值圖】", WINDOW_AUTOSIZE); imshow("【Blue 二值圖】", midImg1); Mat midImg2 = midImg1.clone(); Mat element = getStructuringElement(MORPH_RECT, Size(50, 50)); morphologyEx(midImg1, midImg2, MORPH_CLOSE, element); namedWindow("【Blue 開運算後】", WINDOW_AUTOSIZE); imshow("【Blue 開運算後】", midImg2); //cout << "midImg1.channel=" << midImg1.channels() << endl; //cout << "mdiImg1.depth" << midImg1.depth() << endl; //3.查找圖像輪廓 Mat midImg3 = Mat::zeros(midImg2.rows, midImg2.cols, CV_8UC3); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(midImg2, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); for (int index = 0; index >= 0; index = hierarchy[index][0]) { Scalar color(255, 255, 255); drawContours(midImg3, contours, index, color, NULL, 8, hierarchy); } //namedWindow("【輪廓圖】", WINDOW_NORMAL); //imshow("【輪廓圖】", midImg3); Mat midImg4 = midImg3.clone(); //4.創建包圍輪廓的矩形邊界 int cnt = 0; for (int i = 0; i < contours.size(); i++) { //float length, length2, midx, midy, midx2, midy2; static int length, length2, midx, midy, midx2, midy2; float ang, m, pixel_area, pixel_length, pixel_length2, dis; //每個輪廓 vector<Point> points = contours[i]; //對給定的2D點集,尋找最小面積的包圍矩形 RotatedRect box = minAreaRect(Mat(points)); Point2f vertex[4]; box.points(vertex); //繪製出最小面積的包圍矩形 line(xianshi, vertex[0], vertex[1], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[1], vertex[2], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[2], vertex[3], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[3], vertex[0], Scalar(100, 200, 211), 2, CV_AA); //cout << " [" << i << "] (" << vertex[i].x << "," << vertex[i].y << ")" << endl; //印出座標 //總共 i 個圖形,共 4 * i 個交點 if (i == 0) { for (int i = 0; i < 4; i++) { circle(xianshi, Point(vertex[i].x, vertex[i].y), 8, Scalar(0, 255, 0), 1); //綠色實心角點 ** //將 4 * i 個交點儲存 vertexx[i] = vertex[i].x; vertexy[i] = vertex[i].y; } } else { for (int j = 0; j < 4; j++) { circle(xianshi, Point(vertex[j].x, vertex[j].y), 8, Scalar(0, 255, 0), 1); //綠色實心角點 ** //將 4*i 個交點儲存 vertexx[j + (i * 4)] = vertex[j].x; vertexy[j + (i * 4)] = vertex[j].y; } } //計算長度 pixel_length = sqrt((vertex[0].x - vertex[1].x)*(vertex[0].x - vertex[1].x) + (vertex[0].y - vertex[1].y)*(vertex[0].y - vertex[1].y)); midx = abs((vertex[0].x - vertex[1].x) / 2) + vertex[1].x; midy = abs((vertex[0].y - vertex[1].y) / 2) + vertex[1].y; pixel_length2 = sqrt((vertex[1].x - vertex[2].x)*(vertex[1].x - vertex[2].x) + (vertex[1].y - vertex[2].y)*(vertex[1].y - vertex[2].y)); //3.625 midx2 = abs((vertex[1].x - vertex[2].x) / 2) + vertex[1].x; midy2 = abs((vertex[1].y - vertex[2].y) / 2) + vertex[2].y; //Area pixel_area = pixel_length * pixel_length2; //cout << " Pixel_Length = " << pixel_length << " , Pixel_Length2 = " << pixel_length2 << endl; //cout << (" Pixel_Area ") << i << (" = ") << pixel_area << endl; mag = (pixel_length + pixel_length2) / (2 * 31); length = pixel_length / mag; length2 = pixel_length2 / mag; sprintf_s(text, "%dmm", length); putText(xianshi, text, Point(midx, midy), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** circle(xianshi, Point(midx, midy), 4, Scalar(0, 255, 0), 1); //綠色實心角點 ** sprintf_s(text, "%dmm", length2); putText(xianshi, text, Point(midx2, midy2), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** circle(xianshi, Point(midx2, midy2), 4, Scalar(0, 255, 0), 1); //綠色實心角點 ** //Angle m = (vertex[0].y - vertex[1].y) / (vertex[0].x - vertex[1].x); ang = atan(m)*(180 / pi); //cout << ("m = ") << m << endl; cout << (" Angle ") << i << (" = ") << 90 - ang << endl; //Distance dis = (6.15 * 110) / mag; cout << " Distance = " << dis << " mm" << endl; //mark sprintf_s(text, "%d", i); putText(xianshi, text, Point(midx + 50, midy + 50), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** //繪製中心的光標 Point s1, l, r, u, d; s1.x = (vertex[0].x + vertex[2].x) / 2.0; s1.y = (vertex[0].y + vertex[2].y) / 2.0; l.x = s1.x - 10; l.y = s1.y; r.x = s1.x + 10; r.y = s1.y; u.x = s1.x; u.y = s1.y - 10; d.x = s1.x; d.y = s1.y + 10; line(xianshi, l, r, Scalar(255, 255, 255), 1, CV_AA); //水平 capx = r.x - 10; navx[i] = capx; line(xianshi, u, d, Scalar(255, 255, 255), 1, CV_AA); //垂直 capy = d.y - 10; navy[i] = capy; cout << (" Object Number = ") << i << (", Mid x = ") << capx << (", Mid y = ") << capy << endl; cout << endl; } for (int i = 0; i < contours.size(); i++) { navx[25]; navy[25]; //cout << ("i = ") << i << (", navx = ") << navx[i] << (", navy = ") << navy[i] << endl; }
OpenCV中Mat像素访问和赋值的问题
想调用opencv中的inpaint函数。关于inpaintMask,我想通过遍历srcImage中的每一个像素,当这个像素的三个通道值皆为0时,将inpaintMask该位置像素值置非0。 可是遍历和赋值像素的时候,VS会报错,麻烦各位帮我看看问题所在,谢谢!代码附在了下面,很简单,不难看懂! ``` #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/photo/photo.hpp> #include <iostream> using namespace cv; using namespace std; #define WINDOW_NAME1 "【原始图】" #define WINDOW_NAME2 "【修补后】" Mat srcImage1, inpaintMask; int main(int argc, char ** argv) { Mat srcImage = imread("1.jpg"); if(!srcImage.data) { printf("读取照片错误,请确定目录下是否有imread函数指定的图片存在!\n"); return false; } srcImage1 = srcImage.clone(); inpaintMask = Mat::zeros(srcImage1.size(), CV_8UC1); for(int u1 = 0; u1 < srcImage.rows; u1++) for(int v1 = 0; v1 < srcImage.cols; v1++) { if( srcImage.at<Vec3b>(u1,v1)[0] == 0 && srcImage.at<Vec3b>(u1,v1)[1] == 0 && srcImage.at<Vec3b>(u1,v1)[2] == 0 ) { inpaintMask.at<Vec3b>(u1,v1)[0] = 255; } } // 显示原图 imshow(WINDOW_NAME1, srcImage1); Mat inpaintedImage; inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA); imshow(WINDOW_NAME2, inpaintedImage); waitKey(); return 0; } ```
opencv初学者提问:如何修改Mat元素的值
刚刚接触opencv,Mat数据类型,现在知道怎么访问每个元素的值,但是不知道如何修改特定位置的Mat元素的值,例如一个RGB图片如何提取出某个通道的值?希望高手给说一下,还有就是opencv没有类似android SDk的开发文档吗?
用android studio opencv去检测图片中的三角形和矩形和圆形的数量的大体思路 ,多多指教?
用android studio opencv去检测图片中的三角形和矩形和圆形的数量的大体思路 ,多多指教
malloc(): memory corruption (fast): C++ opencv编写出错
好象是亮度调整那里出错了,可是不知道怎么改 ``` int main(){ Mat re_src_image; Mat src_image = imread("/home/zn/桌面/13740146-f01b848b12b93174.png",1); if(! src_image.data){ cout << "Couldn't find the image!\n"; return false; } else { resize(src_image, re_src_image, Size(640, 480)); vector<Mat> channels; split(re_src_image, channels); re_src_image = channels.at(2); } //亮度调整 int ContrastValue = 100; int BrightValue = 0; Mat light_image = Mat::zeros(re_src_image.size(), re_src_image.type()); for (int y = 0; y < re_src_image.rows; y++) { for (int x = 0; x < re_src_image.cols; x++) { for (int c = 0; c < 3; c++){ light_image.at<Vec3b>(y, x)[c] = (ContrastValue*0.01)*(re_src_image.at<Vec3b>(y, x)[c]) + BrightValue; } } } imshow("a",re_src_image); while(1){ if(waitKey(0)==27) break; } return 0; } ```
c++中用openCV的IplImage*或Mat读取图片后如何转化为File文件流(或者二进制数据)的格式
需要使用c++对图片进行post请求上传,http-body的上传图片格式为File类型。 但是我的图片必须通过openCV读取: IplImage* pImg1 = cvLoadImage("照片(1).jpg"); 或者 cv::Mat mat = cv::imread("照片(1).jpg"); 是IplImage* 或cv::Mat类型的,这样读取的图片是像素值,转化为char* 进行post上传后图片格式不符合File类型,所以怎样能把IplImage* 或cv::Mat类型的图片转化为与HTTP-body对应的File类型(或者二进制数据)进行上传呢?或者有其他的方式,麻烦大家帮忙解决下,谢谢! (备注:不要将图片保存到本地后读取再上传,这种方式太慢)
基于vector和opencv mat基础知识的提问
![变量的正确输出结果是3,4,5.这里全都输出5.。请问大神是哪里的问题图片说明](https://img-ask.csdn.net/upload/201701/15/1484467951_877004.png)
如何转换 yuv420sp的 byte[]数据成opencv 的Mat类型?
如何转换 yuv420sp的 byte[]数据成opencv 的Mat类型? 在android相机中获取数据,想直接转换成mat类型,使用的opencv-android
arm opencv mat内存无法释放
我是在arm上运行的,我的测试代码如下: ``` #include<stdio.h> #include <opencv2/opencv.hpp> #include <opencv2/contrib/contrib.hpp> #include <string> using namespace cv; using namespace std; int main(int argc ,char* argv[]) { vector<Mat> matVec; //Mat tmpMat; IplImage* src; for(int i=0;i<100;++i) { Mat tmpMat; tmpMat.create(cvSize(256,256),CV_8UC1); for(int j=0;j<256;++j) for(int k=0;k<256;++k) { tmpMat.at<uchar>(j,k)=(i+j)%255; } matVec.push_back(tmpMat.clone()); } int index=100; system("free"); printf("Press any key to stop!"); getchar(); while(index>1) { matVec.at(index-1).release(); --index; } matVec.clear(); vector<Mat>(matVec).swap(matVec); system("free"); printf("Press any key to stop!"); getchar(); return 0; } ``` 运行效果如下图: ![图片说明](https://img-ask.csdn.net/upload/201506/15/1434338371_412530.jpg) 释放前后,内存并没有太大变化。我感到很困惑,这是什么原因呢?
OpenCV 的 Mat 内存错误?
新学习Mat类型,编示例程序 #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using namespace cv; int main(){ Mat image=imread("test.jpg"); imwrite("test1.jpg",image); } 结果运行时出错: “0x76322F71 处(位于 CVTest.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0063FA04 处。” 求教是什么地方出错了? IDE为VS2013,其它环境都设置好了,以前用IplImage也一直没出过问题。
OpenCV Mat对象使用数组数据块初始化
OpenCV的官网介绍Mat对象,共列出了25种基本的初始化方法。 其中,对于使用数组数据块的初始化方法官方给出的例子是 ``` double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}}; Mat M = Mat(3, 3, CV_64F, m).inv(); ``` _但是我这样初始化我的Mat对象,数据为什么不对呢 double m[][3] = {{1, 2, 3}, {3, 0, 9}, {1, 3, 8}}; Mat M(3, 3, CV_8U, m); 这样的方式初始化的Mat对象数据根本就不是m数组里面的数据啊。请教高手解答啊 _
关于opencv里实现svm+hog的行人检测
各位大佬们,我想问一下,我在opencv里实现了svm和hog的行人检测,最后要计算检测的精度的时候应该怎么计算,用什么公式?
求一个关于openCV的作业答案,有报酬。
1.利用opencv分别生成3507*2480的蓝(B170,G91,R4)、绿(B126,G162,R73)、红(B32,G23,R228)图片各一张。 2.利用opencv识别以上三张图片上的颜色,识别到蓝色返回B,绿色返回G,红色返回R。
为什么vs2019配置opencv包含目录的路径..\opencv\build\include还要再配置..\opencv\build\include\opencv2
在使用vs2019开发opencv应用的过程中发现,配置项目属性中包含目录和库目录时,需要增加..\opencv\build\include和..\opencv\build\include\opencv2这两个路径,opencv2包含在include下面,那么为什么不能只用\opencv\build\include这一个路径(会找不到头文件)
关于opencv回调函数形参的问题
``` #include<iostream> #include<opencv2/opencv.hpp> #include<stdlib.h> using namespace cv; using namespace std; // 定义全局变量 cv::Mat img_Original; cv::Mat img_Ranged; cv::Mat img_Median; // 定义回调函数 void on_low_height_thresh_trackbar(int, void*); void on_high_height_thresh_trackbar(int, void*); int low_height = 50, high_height = 85; int main() { img_Original = cv::imread("ROI1.jpg", 0); cv::medianBlur(img_Original, img_Median, 5); // 创建窗口 cv::namedWindow("original image"); cv::namedWindow("selected image"); // 创建回调函数进度条 cv::createTrackbar("Low height", "selected image", &low_height, 255, on_low_height_thresh_trackbar); cv::createTrackbar("High height", "selected image", &high_height, 255, on_high_height_thresh_trackbar); // 显示图像 cv::imshow("original image", img_Original); on_low_height_thresh_trackbar(low_height, 0); on_high_height_thresh_trackbar(high_height, 0); cv::waitKey(0); return 0; } // 定义回调函数 void on_low_height_thresh_trackbar(int, void*) { low_height = cv::min(high_height - 1, low_height); cv::setTrackbarPos("Low height", "selected image", low_height); // 选取阈值 cv::inRange(img_Median, low_height, high_height, img_Ranged); // 显示图像 cv::imshow("selected image", img_Ranged); } void on_high_height_thresh_trackbar(int, void*) { high_height = cv::max(high_height, low_height + 1); cv::setTrackbarPos("High height", "selected image", high_height); // 选取阈值 cv::inRange(img_Median, low_height, high_height, img_Ranged); // 显示图像 cv::imshow("selected image", img_Ranged); } ``` void on_low_height_thresh_trackbar(int, void*) void on_high_height_thresh_trackbar(int, void*) 在这两个函数中int,void*这两个形参都没有出现,那么设置这两个形参是为什么呢?
关于c++ Vector申请内存的问题
c++利用vector时,它是有数据头和实际存储空间二部分的,那么它是不是与opencv的Mat类差不多呢,vector<int> *f;与vector<int> f,然后在f.resize(100)或者(*f).resize(100)这二种方法在内存的管理上是不是相差不大呢?
OpenCV Mat问题,想把数组加到矩阵的某一行,赋值出现错误
for(int i=a;i<10;) { //想把数组加到矩阵的某一行 i++; float *p; p=colsmean;//colsmean是个float数组 for(int j=0;j<64;j++) { //matsurfdes_addrow是一个Mat矩阵 matsurfdes_addrow.ptr<float>(i)[j]=(*p); p++; } } matsurfdes_addrow.copyTo(matsurfdes); //错误就出在这里,内存溢出,不知为什么,希望好心传道解惑,先行感谢!
关于opencv-Android开发中mat的问题
在程序中只要加new Mat()语句,程序就会停止运行,去掉就能正常运行,求帮忙啊
爬虫福利二 之 妹子图网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保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2
前后端分离后,维护接口文档基本上是必不可少的工作。 一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了。当然这是一种非常理想的状态,实际开发中却很少遇到这样的情况,接口总是在不断的变化之中,有变化就要去维护,做过的小伙伴都知道这件事有多么头大!还好,有一些工具可以减轻我们的工作量,Swagger2 就是其中之一,至于其他类似功能但是却收费的软...
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
天天学JAVA-JAVA基础(6)
如果觉得我写的还行,请关注我的博客并且点个赞哟。本文主要介绍JAVA 中最常使用字符串常量String相关知识。 1.String简介 2.创建字符串对象两种方式的区别 3.String常用的方法 4.String的不可变性 5.一道阿里面试题,你会做吗? 1.String简介 1.1String源码 首先看一段String源码,String主要实现了Serializable、Compar...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
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)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
2020 网络课 智慧树自动刷课代码,自动跳转,自动答题并关闭弹窗,自动1.5倍速静音
刷课一时爽,一直刷课一直爽! 终于让我找到了这个黑客代码了,教程开始: 只限谷歌浏览器和火狐浏览器使用,如果第一次失败,请重新试一下次 将下面代码复制后,进入浏览器按F12键,先点击console 然后Ctrl+v复制代码 最后按回车键即可 var ti = $("body"); var video = $(".catalogue_ul1 li[id*=video-]"); var i = 1;...
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
羞,Java 字符串拼接竟然有这么多姿势
二哥,我今年大二,看你分享的《阿里巴巴 Java 开发手册》上有一段内容说:“循环体内,拼接字符串最好使用 StringBuilder 的 append 方法,而不是 + 号操作符。”到底为什么啊,我平常一直就用的‘+’号操作符啊!二哥有空的时候能否写一篇文章分析一下呢? 就在昨天,一位叫小菜的读者微信我说了上面这段话。 我当时看到这条微信的第一感觉是:小菜你也太菜了吧,这都不知道为啥啊!我估...
写1行代码影响1000000000人,这是个什么项目?
不带钱不带卡,只带手机出门就能畅行无阻,这已是生活的常态。益普索发布的《2019第一季度第三方移动支付用户研究》报告显示,移动支付在手机网民中的渗透率高达95.1%,截至今年1月,支付宝全球用户数已经突破10亿。你或许每天都会打开支付宝,付款购物、领取权益、享受服务……但你或许不知道的是,在这个方便、快捷、智能化的APP背后,有一群年轻的技术人,用智慧和创新让它每天都变得更“聪明”一点。 ...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
一点一滴记录 Java 8 stream 的使用
日常用到,一点一滴记录,不断丰富,知识积累,塑造自身价值。欢迎收藏 String 转 List String str = 1,2,3,4; List&lt;Long&gt; lists = Arrays.stream(str.split(",")).map(s -&gt; Long.parseLong(s.trim())).collect(Collectors.toList()); Lis...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问