菜鸟第一次接触虚拟机及菜鸟的第一个类
这周重新系统学了下C++类部分。研一时总是看不懂的东西现在看懂了并慢慢深入,学得很带劲。以前从没接触过虚拟机,老板把他配置好的给我,我装上了,可以运行。我电脑是win7 64位的。我把他发给我的都放在一个目录下:https://pan.baidu.com/s/1jHISZTs 这个解压后放一个文件夹。 https://pan.baidu.com/s/1hr8NHOS 这个解压后有10个文件和另
这周重新系统学了下C++类部分。研一时总是看不懂的东西现在看懂了并慢慢深入,学得很带劲。以前从没接触过虚拟机,老板把他配置好的给我,我装上了,可以运行。我电脑是win7 64位的。我把他发给我的都放在一个目录下:https://pan.baidu.com/s/1jHISZTs 这个解压后放一个文件夹。 https://pan.baidu.com/s/1hr8NHOS 这个解压后有10个文件和另两个文件一起放一个文件夹 但另两个我传不上来 超过4G了 等哪次可以传上来了我再补充上来。
安装好以后出现图标:这就是应用程序了。
打开:
点击:开启此虚拟机:等待
输入用户名和密码之后进入:
双击打开出现
等待 出现:然后可以添加工程项目:File-New-C++project 再对创建的项目工程右击New-Folder :我创建了src文件夹专门用来放源文件等 看再这样创建src2文件夹
如这个工程:这是整个工程或者说workspace 然后右击setting:
第一在这里添加库:
第二继续添加库:
第三:继续添加需要用的库:
第一个lib是必须的。其它是根据实际程序添加。
另外在编写程序时窗口不够大 可以用快捷键Ctrl+Alt+Enter在全屏和还原之间切换 很方便!
当吃饭去了回来它锁屏了 按一下Enter输入密码就好了。
每次要运行时要先右击项目-Clean Project或者Build Project再按Ctrl+F11运行:
比如程序今天没编辑完 想明天继续编辑 那么可以将这个虚拟机挂起 下次打开就是直接这个界面:
变成 就OK了。
/
上两周重学C++的面向对象部分:第一个类 是根据图片用某个小算法判断是矿还是废石 统计矿的个数 将矿保存进一个文件夹 将废石也保存进一个文件夹
类的实现部分:
#include "Myxiaowang.h"
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
#define allnum (484 * 364)
char src_ipl[100];
char kuang_path[100];
char stone_path[100];
fluore::fluore(float thresh){
threshold = thresh;
}
void fluore::get_imgs(char* src_folders,int src_num){
string a = src_folders;
a.append("\\%d.bmp");
for (int i = 1; i <= src_num; i++){
sprintf(src_ipl, a.c_str(), i);
//sprintf(src_ipl, "front_B_fluore\\%d.bmp", i);
Mat theimg = imread(src_ipl);
imgs.push_back(theimg);
}
}
void fluore::classify(){
for (vector<Mat>::iterator i = imgs.begin(); i!=imgs.end(); i++){
Mat srcimg = *i;
int num = 0;
for (int j = 0; j < srcimg.rows; j++){
uchar* data = srcimg.ptr<uchar>(j);
for (int i = 0; i < srcimg.cols; i++){
if (data[i] == 255)
++num;
}
}
float ratio = (float)num / allnum;
if (ratio >= threshold)
classify_results.push_back(true);
else
classify_results.push_back(false);
}
}
int fluore::return_number(){
int allkuang = 0;
for (vector<bool>::iterator it = classify_results.begin(); it != classify_results.end(); ++it){
bool temp = *it;
if (temp)
++allkuang;
}
return allkuang;
}
void fluore::save_folders(char* kuang_folder, char* stone_folder){
int kuangnum = 0;
int stonenum = 0;
string kuangstr = kuang_folder;
string stonestr = stone_folder;
kuangstr.append("\\%d.bmp");
stonestr.append("\\%d.bmp");
vector<Mat>::iterator i = imgs.begin();
for (vector<bool>::iterator it = classify_results.begin(); it != classify_results.end();++it,++i)
{
bool temp = *it;
Mat tempimg = *i;
if (temp){
++kuangnum;
//sprintf(kuang_path, strcat(kuang_folder, "\\%d.bmp"), kuangnum);//这样strcat()是不对的 kuang_folder我给的是一个常量 后面的加进来地方不够
sprintf(kuang_path, kuangstr.c_str(), kuangnum);
imwrite(kuang_path, tempimg);
}
else
{
++stonenum;
//sprintf(stone_path, strcat(stone_folder, "\\%d.bmp"), stonenum);
sprintf(stone_path, stonestr.c_str(), stonenum);
imwrite(stone_path, tempimg);
}
}
}
fluore::~fluore()
{
}
我本来将保存和判断放一个函数了 不对的 面向对象的单一性原则 一个成员函数就一个功能最好。
测试部分:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include "Myxiaowang.h"
#include <string>
using namespace std;
using namespace cv;
void main(){
fluore myfluore(0.005);
myfluore.get_imgs("front_B_fluore",364);//读图
myfluore.classify();//分类
int kuangnum = myfluore.return_number();//统计
cout << kuangnum << endl;
myfluore.save_folders("kuang", "stone");//保存
}
///菜鸟努力从面向过程向面向对象转变 争取尽快建立面向对象的编程思想
/
我同事给我一个VS2013的插件 https://pan.baidu.com/s/1miCZ4c4 这个在编写时 如果我定义了一个指针类型的对象 使用其函数时我用的.点操作符 那其实是不对的 但这个插件会自动换成->箭头操作符。很方便 当把这个插件放在VS安装目录并替换那个VA_X文件后 它就自动到VS界面去了:
就是这个东西。
更多推荐
所有评论(0)