15,980
社区成员
发帖
与我相关
我的任务
分享
#include "iostream.h"
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include "cv.h"
#include "highgui.h"
#include "cxcore.hpp"
IplImage* src=NULL;
IplImage* bin=NULL;
IplImage* bing=NULL;
IplImage* psrc=NULL;
IplImage* dst=NULL;
#define max_corners 100
int thresh=134;
void on_trackbar(int thresh)
{
cvThreshold(psrc,bing,thresh,255,CV_THRESH_BINARY_INV);
cvShowImage("bing",bing);
}
main()
{
double scale=0.46;
int mode=CV_RETR_EXTERNAL;//提取轮廓模式
int contours_num=0,contours_nums=0;//提取的轮廓数目
// CvScalar external_color;//绘制轮廓线的颜色
CvMemStorage* storage=cvCreateMemStorage(0);
CvSeq* contour=0;//存储提取轮廓的序列指针
CvSize bin_cvsize;
CvSize bing_cvsize;
CvSize psrc_cvsize;
src=cvLoadImage("020.jpg",-1);
bin_cvsize.width=(int)(src->width*scale);
bin_cvsize.height=(int)(src->height*scale);
bin=cvCreateImage(bin_cvsize,src->depth,src->nChannels);
cvResize(src,bin,CV_INTER_LINEAR);
cvNamedWindow("bin",CV_WINDOW_AUTOSIZE);
cvShowImage("bin",bin);
dst=cvLoadImage("020.jpg",0);
bing_cvsize.width=(int)(dst->width*scale);
bing_cvsize.height=(int)(dst->height*scale);
bing=cvCreateImage(bing_cvsize,dst->depth,dst->nChannels);
cvResize(dst,bing,CV_INTER_LINEAR);
psrc_cvsize.width=(int)(dst->width*scale);
psrc_cvsize.height=(int)(dst->height*scale);
psrc=cvCreateImage(psrc_cvsize,dst->depth,dst->nChannels);
cvResize(dst,psrc,CV_INTER_LINEAR);
cvNamedWindow("bing",CV_WINDOW_AUTOSIZE);
cvCreateTrackbar("threshold","bing",&thresh,255,on_trackbar);// 滚动条设置
on_trackbar(thresh);
cvWaitKey(0);//等待按键
IplImage *Rol,*Rol_gray;//定义中间指针,指向感兴趣的区域
CvRect rect;//定义一个矩形,用来记录轮廓的矩形区域
//找到外轮廓
cvFindContours(bing,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
for(;contour;contour=contour->h_next)
{
int x,y;
if(contour->total<300)
continue;
//标记箱体区域
cvDrawContours(bin,contour,CV_RGB(255,0,0),CV_RGB(255,0,0),0,1,8,cvPoint(0,0));
//显示标记后的图像
cvNamedWindow("markImage",CV_WINDOW_AUTOSIZE);
cvShowImage("markImage",bin);
rect= ((CvContour*)contour)->rect;
cvSetImageROI(bin,rect);
Rol = cvCreateImage( cvSize(rect.width, rect.height), bin->depth, bin->nChannels );
Rol_gray = cvCreateImage( cvSize(rect.width, rect.height), bing->depth, bing->nChannels );
cvCopy(bin,Rol);
cvNamedWindow( "Rol", CV_WINDOW_AUTOSIZE ); //创建窗口
cvShowImage( "Rol", Rol); //显示图像
cvWaitKey(0); //等待按键
cvDestroyWindow( "markImage" );
cvDestroyWindow( "Rol" );
}
cvCvtColor(Rol,Rol_gray,CV_BGR2GRAY);//将彩色图转灰度图
//以固定阈值将图像二值化
cvThreshold(Rol_gray,Rol_gray,120,255, CV_THRESH_BINARY );
//有rent得到矩形的四角的坐标
CvPoint pt1, pt2;
pt1.x = rect.x;
pt1.y = rect.y;
pt2.x = rect.x + rect.width;
pt2.y = rect.y + rect.height;
//将rol区分割成12个部分,以便确定各个物体的位置
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(rect.width,0.34*rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(rect.width,0.67*rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(rect.width,rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(0.25*rect.width,rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(0.5*rect.width,rect.height),cvScalar(255,255,255),1);
cvRectangle(Rol_gray,cvPoint(0,0),cvPoint(0.75*rect.width,rect.height),cvScalar(255,255,255),1);
cvNamedWindow( "Rolgray", 1 ); //创建窗口
cvShowImage( "Rolgray", Rol_gray); //显示图像
int i,j,k,sum = 0;
int height,width,step,Channels;
height=Rol_gray->height;
width=Rol_gray->width;
step =Rol_gray->widthStep;
uchar *data = (uchar*)Rol_gray->imageData;
for(i=0;i<0.34*height;i++) for(j=0;j<0.25*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1200)
printf("(1,1)位置缺");
sum = 0;
for(i=0;i<0.34*height;i++) for(j=0.25*width;j<0.5*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(1,2)位置缺");
sum = 0;
for(i=0;i<0.34*height;i++) for(j=0.5*width;j<0.75*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1000)
printf("(1,3)位置缺");
sum = 0;
for(i=0;i<0.34*height;i++) for(j=0.75*width;j<width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1200)
printf("(1,4)位置缺");
sum = 0;
for(i=0.34*height;i<0.67*height;i++) for(j=0;j<0.25*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(2,1)位置缺");
sum = 0;
for(i=0.34*height;i<0.67*height;i++) for(j=0.25*width;j<0.5*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1000)
printf("(2,2)位置缺");
sum = 0;
for(i=0.34*height;i<0.67*height;i++) for(j=0.5*width;j<0.75*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1000)
printf("(2,3)位置缺");
sum = 0;
for(i=0.34*height;i<0.67*height;i++) for(j=0.75*width;j<width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(2,4)位置缺");
sum = 0;
for(i=0.67*height;i<height;i++) for(j=0;j<0.25*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1200)
printf("(3,1)位置缺");
sum = 0;
for(i=0.67*height;i<height;i++) for(j=0.25*width;j<0.5*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(3,2)位置缺");
sum = 0;
for(i=0.67*height;i<height;i++) for(j=0.5*width;j<0.75*width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<1100)
printf("(3,3)位置缺");
sum = 0;
for(i=0.67*height;i<height;i++) for(j=0.75*width;j<width;j++)
{
if(data[i*step+j]>200)
sum++;
}
if(sum<2300)
printf("(3,4)位置缺");
cvWaitKey(0);
cvDestroyWindow( "Rolgray" );
cvDestroyWindow("src");
cvDestroyWindow("dst");
cvReleaseImage(&src);
cvReleaseImage(&psrc);
cvReleaseImage(&bin);
cvReleaseImage(&dst);
cvReleaseMemStorage(&storage);
return 0;
}