/* * 用于对图像数据的处理 * */ 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,®ionInfo); //将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; }