Exemple #1
0
/*
 * 用于对图像数据的处理
 * */
JNIEXPORT jint JNICALL Java_com_nova_novapro_MainActivity_TransImage
  (JNIEnv *env, jobject obj)
{
	char* source = "/sdcard/capture/1.bmp";
	char* dest = "/sdcard/capture/dest1.bmp";
	int ret;
	int arrage;
	unsigned char* tmpBuffer;
	unsigned char* locationMark;
	RegionInfo regionInfo;

	regionInfo.xres = 32;
	regionInfo.yres = 16;

	int pic_size = picInfo.xres * picInfo.yres * picInfo.bpp;
	LOGD("pic_size=%d\n",pic_size);

	//为tmpBuffer分配内存
	tmpBuffer = (unsigned char*)malloc(pic_size);
	if(tmpBuffer == NULL){
		LOGD("malloc date error!");
	}

	//将bmp图像中的数据读取到tmpbuffer中
	ret = ReadBmp2Buffer(source,dest,&picInfo,tmpBuffer);
	//进行一个RGB到灰度值的转换
	ret = RGB2GREY(&picInfo,tmpBuffer);

	//获取图像的二值化阈值
	arrage = GetThreshold(&picInfo,tmpBuffer);
	LOGD("Threshold=%d\n",arrage);


	//将图片中小于arrage的数据设置为0 二值化
	Thresholding(arrage,&picInfo,tmpBuffer);

	//从图像中心开始对图像进行定位操作
	ret = locataImage(&picInfo,tmpBuffer,&regionInfo);

	//将date数据保存到bmp中
	ret = saveDate2BMP(&picInfo,tmpBuffer,dest);

	free(tmpBuffer);

	return ret;

}
	cv::Mat process(int newSize) {
		image = Thresholding(image).transform();
		
		// cut egdes:

		for (int i = 0; i < image.rows; i ++) {
			if (!processRow(i)) {
				break;
			}
		}

		for (int i = image.rows - 1; i >= 0; i --) {
			if (!processRow(i)) {
				break;
			}
		
		}

		for (int i = 0; i < image.cols; i ++) {
			if (!processCol(i)) {
				break;
			}
		}

		for (int i = image.cols - 1; i >= 0; i --) {
			if (!processCol(i)) {
				break;
			}
		}

		for (int i = 0; i < used.size(); i ++)
			for (int j = 0; j < used[i].size(); j ++)
				used[i][j] = 0;

		int L = 1;
		for (int i = 0; i < image.rows; i ++)
			for (int j = 0; j < image.cols; j ++) 
				if (image.at<uchar>(i, j) == BLACK && used[i][j] == 0) {
					dfs(i, j, L);
					L ++;
				}

		std::map<int,int> cnt;
		for (int i = 0; i < image.rows; i ++)
			for (int j = 0; j < image.cols; j ++) 
				if (used[i][j] != 0)
					cnt[used[i][j]] ++;

		int max_value = 0;
		int best_comp;
		for (std::map<int,int>::iterator it = cnt.begin(); it != cnt.end(); it ++)
			if (it->second > max_value) {
				max_value = it->second;
				best_comp = it->first;
			}
		
		for (int i = 0; i < image.rows; i ++)
			for (int j = 0; j < image.cols; j ++) 
				if (used[i][j] != best_comp) {
					image.at<uchar>(i,j) = WHITE;
				}

		int minRow = image.rows;
		int maxRow = -1;
		int minCol = image.cols;
		int maxCol = -1;
		
		for (int i = 0; i < image.rows; i ++)
			for (int j = 0; j < image.cols; j ++)
				if (image.at<uchar>(i,j) == BLACK) {
					minRow = std::min(minRow, i);
					maxRow = std::max(maxRow, i);
					minCol = std::min(minCol, j);
					maxCol = std::max(maxCol, j);
				}
		int X = minCol;
		int Y = minRow;
		int W = maxCol - minCol + 1;
		int H = maxRow - minRow + 1;
		int X0 = X - std::max(0, H - W) / 2;
		int Y0 = Y - std::max(0, W - H) / 2;
		try {
			image = Image::getSubMatrix(image, X0, Y0, std::max(W, H), std::max(W,H));
		} catch (...) {
		}
		cv::Mat newImage;
		cv::resize(image, newImage, cv::Size(newSize, newSize));
		newImage = Thresholding(newImage).transform();
		return newImage;
	}