opencv 抠图联通块(c接口)
#include "stdio.h"
#include "iostream"
#include "opencv/cv.h"
#include "opencv2/opencv.hpp"
#include "basicOCR.h"
#include "time.h"
using namespace std;
using namespace cv; void ImageRect(IplImage *srcImg, IplImage *dstImg);
int main()
{
/*basicOCR bor;
IplImage *image = cvLoadImage("585.pbm",1);
IplImage *gray = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
cvCvtColor(image,gray,CV_RGB2GRAY);
bor.classify(gray,1);
//printf("depth = %d\nwidth = %d\nheight = %d\nnChannels = %d\n",image->depth,image->width,image->height,image->nChannels); image = cvLoadImage("608.pbm",1);
cvCvtColor(image,gray,CV_RGB2GRAY);
bor.classify(gray,1); image = cvLoadImage("test002.jpg",1);
IplImage *gray1 = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
cvCvtColor(image,gray1,CV_RGB2GRAY);
bor.classify(gray1,1);
*/
basicOCR bor;
int type;
while(scanf("%d",&type)!=EOF)
{
if(type == -1)
break; char path[20];
sprintf(path,"./test00%d.jpg",type);
clock_t start,finish;
start = clock();
IplImage *srcImage = cvLoadImage(path,1);
if(srcImage==NULL){
printf("%s : path is error...",path);
continue;
} IplImage *gray2 = cvCreateImage(cvSize(128,128),IPL_DEPTH_8U,1);
ImageRect(srcImage,gray2);
//cvCvtColor(srcImage,gray2,CV_RGB2GRAY);
bor.classify(gray2,1);
finish = clock();
double duration = (double)(finish-start)/CLOCKS_PER_SEC;
printf("检测时间: %f seconds\n",duration); }
return 0;
}
void ImageRect(IplImage *srcImg, IplImage *dstImg)
{
IplImage *tempImg = cvCreateImage(cvGetSize(srcImg),IPL_DEPTH_8U,1);
IplImage *resultImg = cvCreateImage(cvGetSize(srcImg),IPL_DEPTH_8U,1);
IplImage *backgroundImg = cvCreateImage(cvSize(128,128),8,1);
cvZero(backgroundImg);
for(int i = 0; i<backgroundImg->height;i++)
{
unsigned char *data = (unsigned char*)backgroundImg->imageData+i*backgroundImg->widthStep;
for(int j=0; j<backgroundImg->width;j++)
{
data[j] = 0;
}
}
//cvShowImage("back",backgroundImg);
cvCvtColor(srcImg,tempImg,CV_RGB2GRAY);
cvThreshold(tempImg,tempImg,220,255,CV_THRESH_BINARY_INV);
cvCopy(tempImg,resultImg);
CvMemStorage *storage = cvCreateMemStorage();
//cvShowImage("h0",tempImg);
CvSeq *contours = NULL;
cvFindContours(tempImg,storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
int area;
CvRect rect;
while(contours)
{
rect = cvBoundingRect(contours,0);
area = rect.width * rect.height;
if(area>50)
{
printf("x");
//cvRectangle(resultImg,cvPoint(rect.x,rect.y),cvPoint(rect.x+rect.width,rect.y+rect.height),CV_RGB(200,200,200),1,8,0);
int mHeight = 60;
int mWidth = 60;
int mLeft = 40;
int mTop = 40;
if(rect.height>rect.width)
{
mWidth = (int)(60.0*rect.width/rect.height);
}else{
mHeight = (int)(60.0*rect.height/rect.width);
}
IplImage *foregroundImg = cvCreateImage(cvSize(mWidth,mHeight),8,1); cvSetImageROI(resultImg,rect);
cvSetImageROI(backgroundImg,cvRect(mLeft,mTop,mWidth,mHeight));
cvResize(resultImg,foregroundImg,CV_INTER_NN);
cvCopy(foregroundImg,backgroundImg);
cvResetImageROI(backgroundImg);
cvResetImageROI(resultImg); cvReleaseImage(&foregroundImg);
}
contours = contours->h_next;
}
//cvShowImage("h2",resultImg); cvThreshold(backgroundImg,backgroundImg,220,255,CV_THRESH_BINARY_INV);
cvSmooth(backgroundImg,backgroundImg,CV_BLUR,3,3,0,0);
cvDilate(backgroundImg,backgroundImg,NULL,1);
cvErode(backgroundImg,backgroundImg,NULL,2); cvThreshold(backgroundImg,backgroundImg,220,255,CV_THRESH_BINARY);
cvCopy(backgroundImg,dstImg,NULL);
cvSaveImage("./epsq3.jpg",backgroundImg); //cvShowImage("background",backgroundImg);
//cvWaitKey(0);
cvReleaseMemStorage(&storage);
cvReleaseImage(&tempImg);
cvReleaseImage(&resultImg);
cvReleaseImage(&backgroundImg); }
/*#include "stdio.h"
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include "opencv2/opencv.hpp"
int main()
{ IplImage *img = cvLoadImage("./paper.jpg",1); cvShowImage("showImage",img);
cvWaitKey(0);
printf("xx\n"); return 0;
}*/
#include <stdio.h>
#include <opencv/highgui.h>
#include <zbar.h>
#include <time.h>
#include <opencv2/opencv.hpp>
#include <opencv/cv.h>
#include <iostream> using namespace std;
using namespace cv;
using namespace zbar; #define FLOAT 10
#define PICTURE "er2.jpg"
int main(int argc,char *argv[])
{ //加载原图
IplImage *srcImage = cvLoadImage(PICTURE,1);
//cvNamedWindow("1.原图",0);
//cvShowImage("1.原图",image); //测时
clock_t start, finish;
double duration;
start = clock();
//转变为灰度图
IplImage *Grayimage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U, 1);
cvCvtColor(srcImage,Grayimage,CV_BGR2GRAY); //cvNamedWindow("Grayimage",0);
// cvShowImage("Grayimage",Grayimage); //通过sobel来对图片进行竖向边缘检测,输入图像是8位时,输出必须是16位,然后再将图像转变成8位深
IplImage *sobel = cvCreateImage(cvGetSize(Grayimage),IPL_DEPTH_16S,1);
cvSobel(Grayimage,sobel,2,0,7); IplImage *temp = cvCreateImage(cvGetSize(sobel),IPL_DEPTH_8U,1);
cvConvertScale(sobel,temp,0.002,0); //cvNamedWindow("temp",0);
//cvShowImage("temp",temp); //对图像进行二值化处理
IplImage *threshold = cvCreateImage(cvGetSize(temp),IPL_DEPTH_8U,1);
cvThreshold(temp,threshold,13,100,CV_THRESH_BINARY/*| CV_THRESH_OTSU*/);
//cvThreshold(temp, threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY); //cvNamedWindow("threshold",0);
//cvShowImage("threshold",threshold); //自定义1*3的核进行X方向的膨胀腐蚀
IplImage *erode_dilate=cvCreateImage(cvGetSize(threshold),IPL_DEPTH_8U,1);
IplConvKernel* kernal = cvCreateStructuringElementEx(3,1, 1, 0, CV_SHAPE_RECT);
cvDilate(threshold, erode_dilate, kernal, 15);//X方向膨胀连通数字
cvErode(erode_dilate, erode_dilate, kernal, 6);//X方向腐蚀去除碎片
cvDilate(erode_dilate, erode_dilate, kernal, 1);//X方向膨胀回复形态 //自定义3*1的核进行Y方向的膨胀腐蚀
kernal = cvCreateStructuringElementEx(1,3, 0, 1, CV_SHAPE_RECT);
//cvDilate(erode_dilate, erode_dilate, kernal, 5);
cvErode(erode_dilate, erode_dilate, kernal, 2);// Y方向腐蚀去除碎片
cvDilate(erode_dilate, erode_dilate, kernal, 6);//回复形态 //cvNamedWindow("erode_dilate",0);
//cvShowImage("erode_dilate",erode_dilate); //图形检测
IplImage* copy = cvCloneImage(erode_dilate);//直接把erode_dilate的数据复制给copy
IplImage* copy1 = cvCloneImage(srcImage);//直接把image的数据复制给copy1
CvMemStorage* storage = cvCreateMemStorage();
CvSeq* contours;
cvFindContours(copy, storage, &contours);
int i=0,k=0,j=0;
CvRect RECT[100];
CvRect Rect[100]; while(contours != NULL)
{
//绘制轮廓的最小外接矩形,如果满足条件,将该矩形绘制在显示图片dst
/*
矩形要求:
1.宽度与高度的比值在(2,5)之间
2.面积大于图像的 1/20000
3.y轴的位置在图像高度减去50以下
*/
CvRect rect=cvBoundingRect( contours, 1 ); //cvBoundingRect计算点集的最外面(up-right)矩形边界。
if(rect.width/rect.height>0.8
&&rect.width/rect.height<1.2
&&rect.height*rect.height*FLOAT>copy1->height*copy1->width
&&rect.y<copy1->height-50
)
{
printf("rect.x = %d rect.y = %d rect.width = %d rect.height = %d\n",rect.x,rect.y,rect.width,rect.height);
//rect.x-=10;
// rect.y-=10;
// rect.width+=20;
// rect.height+=20;
RECT[i]=rect; //将图片中符合的矩形区域存到RECT
i++;
}
contours= contours->h_next; }
printf("Find the rect %d!\n",i);
for(j=0;j<i;j++)
{
if(j==0)
{
cvRectangleR(copy1,RECT[j],CV_RGB(255,0,0),3);
Rect[k]=RECT[j];
k++;
//printf("j = %d\n",j);
//printf("The j is the %d!\n",j);
}
else if(RECT[j-1].y-RECT[j].y>100
||(RECT[j-1].x-RECT[j].x>200
||RECT[j].x-RECT[j-1].x>200))
{
cvRectangleR(copy1,RECT[j],CV_RGB(255,0,0),3);
Rect[k]=RECT[j];
k++;
//printf("The jj is the %d!\n",j);
}
} cvNamedWindow("copy1",0);
cvShowImage("copy1",copy1);
//cvWaitKey(0);
//cvReleaseImage(&Grayimage);
cvReleaseImage(&temp);
cvReleaseImage(&threshold);
cvReleaseImage(&erode_dilate);
cvReleaseImage(&srcImage);
cvReleaseImage(©);
cvReleaseImage(©1);
// create a reader
//srcImage = cvLoadImage(PICTURE,1);
srcImage = Grayimage;//解码图片必需位灰度图
ImageScanner scanner; // configure the reader
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); // obtain image data const void *raw = NULL;
//int width=srcImage->width;
//int height=srcImage->height;
//raw = srcImage->imageDataOrigin;
//cvMat(int rows, int cols, int type, void * data CV_DEFAULT(NULL))
//cout<<"The number is the one!"<<endl;
Mat im(srcImage, TRUE);
int width=im.cols;
int height=im.rows;
raw = im.data;
// wrap image data
zbar::Image image(width, height, "Y800", raw, width * height); // scan the image for barcodes
int n = scanner.scan(image); std::string strTemp="";
// extract results
//cout<<"The number is the two!"<<endl;
zbar::Image::SymbolIterator symbol = image.symbol_begin();
//cout<<"The number is the three!"<<endl;
cout << "decoded " << symbol->get_type_name()<<endl; for(;symbol != image.symbol_end();++symbol)
{
// do something useful with results strTemp =strTemp +symbol->get_data()+";";
cout << "decoded " << symbol->get_type_name()<< " symbol \"" << symbol->get_data() << '"' << endl;
} // clean up
image.set_data(NULL, 0); cvWaitKey(0);
cvReleaseImage(&Grayimage);
return(0);
}
opencv 抠图联通块(c接口)的更多相关文章
- Codeforces 731C. Socks 联通块
C. Socks time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input o ...
- Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量
D. Directed Roads ZS the Coder and Chris the Baboon has explored Udayland for quite some time. The ...
- Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)
题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...
- 【UVA10765】Doves and bombs (BCC求割点后联通块数量)
题目: 题意: 给了一个联通无向图,现在问去掉某个点,会让图变成几个联通块? 输出的按分出的从多到小,若相等,输出标号从小到大.输出M个. 分析: BCC求割点后联通块数量,Tarjan算法. 联通块 ...
- POJ 1523 SPF (去掉割点能形成联通块的个数)
思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...
- HDU - 1213 dfs求联通块or并查集
思路:给定一个无向图,判断有几个联通块. AC代码 #include <cstdio> #include <cmath> #include <algorithm> ...
- [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 链表加bfs求补图联通块
https://oj.neu.edu.cn/problem/1387 给一个点数N <= 100000, 边 <= 1000000的无向图,求补图的联通块数,以及每个块包含的点数 由于点数 ...
- bzoj2200拓扑排序+最短路+联通块
自己写的不知道哪里wa了,明明和网上的代码差不多.,. /* 给定一张图,有的边是无向边,有的是有向边,有向边不会出现在环中,且有可能是负权值 现在给定起点s,求出s到其余所有点的最短路长度 任何存在 ...
随机推荐
- Gitbook简易教程
简介 GitBook 是一个基于 Node.js 的命令行工具,可使用 Github/Git 和 Markdown 来制作精美的电子书.GitBook支持输出以下几种文档格式 静态站点:GitBook ...
- [超级懒人最简单法]iPhone 6 plus 适配切图方法分享(转载文章)
网络上已经有很多适配教程,可是看了半天总是半懂不懂..最后还是要综合多个教程再动动脑子动动手,最好有程序大哥帮你试一下(这得有多大的福气) 如果有跟我一样情况的: 1. 有人说用sketc ...
- poj2689Prime Distance 素数测试
朴素素数测试是O(x1/2)的,每一个数都测试下来就炸了 然而如果全部预处理的话才是做大死,时间空间各种炸(大约有1亿个数) 所以怎么平衡一下呢? 其实在预处理的时候可以只处理一半:把21474836 ...
- pod 安装总结
参考http://code4app.com/article/cocoapods-install-usage http://www.jianshu.com/p/32d9cfb91471 原文:http: ...
- springboot+dubbo之多端口注入服务
前面介绍了,springboot+dubbo基础整合,这篇介绍多端口注入服务. springboot使用@Bean注入dubbo服务,当你是单一的ProviderConfig实例,dubbo的@Ser ...
- scrapy爬虫笔记(二)------交互式爬取
开始网页爬取:(1)交互式爬取 首先,我们使用scrapy建立起爬虫的框架.在命令行中输入 scrapy shell “url” 如:scrapy shell “http://www.baidu.co ...
- java实现图像灰度化
/*在研究Java实现将一张图片转成字符画的时候,发现将图像转化字符串是根据照片的灰度采用不同的字符画出来,形成一个灰度表.于是就研究了下关于灰度值这个东西,于是跳了一个大坑...因为鄙人用的ubun ...
- opencv的问题
opencv中图像文件格式是BRG的顺序 而QImage是RGB形式 H:色彩 S:深浅 s=0 只有灰度 V:明暗
- strace追踪mysql执行语句
一.strace参数 strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息.追踪程序运行时的整个生命周期,输出每一个系统调用的名字,参数,返回值和 ...
- 掌握Thinkphp3.2.0----自动完成
自动完成,是在create数据的时候自动执行的一个或多个动作 自动完成也分为动态和静态两种 格式: //完成规则array( array(完成字段1,完成规则,[完成条件,附加规则]), array( ...