这周重新系统学了下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界面去了:

就是这个东西。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐