24,854
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define binaryname "二值图"
#define binarytrack "二值图阈值"
#define copy "二维数组存储图"
#define newdel "微分边缘化"
IplImage *src;
IplImage *binary;
IplImage *copy1;
IplImage *copy2;
void on_trackbar(int pos);
int main(int argc, char* argv[])
{
//载入原图的灰度图并显示
src = cvLoadImage("F:\\Pictrue\\picturefortest\\bmp.bmp", 0);
cvNamedWindow("source", 1);
cvShowImage("source", src);
int m = src->height;//行
int n = src->width;//列
int i, j;
printf("channel = %d", src->nChannels);//显示通道数
//创建动态指针
int **p;
int **p2;
p = new int *[m];
p2 = new int *[m];
for (i = 0; i < m; i++)
{
p[i] = new int[n];
p2[i] = new int[n - 1];
}
//初始化二值图并创建窗口
binary = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//创建二值图
cvNamedWindow(binaryname, CV_WINDOW_AUTOSIZE);//创建二值图窗口
//创建滑动条
int nThreshold;
cvCreateTrackbar(binarytrack, binaryname, &nThreshold, 255, on_trackbar);
on_trackbar(nThreshold);//执行回调函数,转化二值图像
//获取binary像素信息并保存
CvScalar s;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
s = cvGet2D(binary, i, j);//CvGet2D函数作用:获取图像的颜色值
p[i][j] = s.val[0];
}
}
//显示保存的像素信息
copy1 = cvCreateImage(cvGetSize(binary), 8, 1);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
cvSetReal2D(copy1, i, j, p[i][j]);
}
}
cvNamedWindow(copy, 1);
cvShowImage(copy, copy1);
//微分边缘化,结果存进新数组
for (i = 0; i < m; i++)
{
for (j = 0; j < n - 1; j++)
{
if (p[i][j + 1] > p[i][j])
p2[i][j] = p[i][j + 1] - p[i][j];
else
{
p2[i][j] = -(p[i][j + 1] - p[i][j]);
}
}
}
//显示微分后的新数组
IplImage *copy2 = cvCreateImage(cvGetSize(binary), 8, 1);
for (i = 0; i < m; i++)
{
for (j = 0; j < n - 1; j++)
{
cvSetReal2D(copy2, i, j, p2[i][j]);
}
}
cvNamedWindow(newdel, 1);
cvShowImage(newdel, copy2);
cvWaitKey();
cvReleaseImage(&src);
cvReleaseImage(©1);
cvReleaseImage(©2);
cvReleaseImage(&binary);
cvDestroyAllWindows();
for (i = 0; i < m; i++)
{
delete[] p[i];
delete[] p2[i];
}
delete[] p;
delete[] p2;
return 0;
}
//回调函数 将灰度图转化为二值图并显示
void on_trackbar(int pos)
{
cvThreshold(copy1, binary, pos, 255, CV_THRESH_BINARY);//转化为二值图
cvShowImage(binaryname, binary);
printf("channel = %d", binary->nChannels);
}
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc_c.h"
using namespace std;
using namespace cv;
Mat img,smallImg,gray,bw;
vector<Vec4i> hierarchy;
vector<vector<Point> > contours;
int threshval=128;
Rect r;
Rect maxrect,brect;
int idx,n;
const static Scalar colors[15]={
CV_RGB( 0, 0,128),
CV_RGB( 0,128, 0),
CV_RGB( 0,128,128),
CV_RGB(128, 0, 0),
CV_RGB(128, 0,128),
CV_RGB(128,128, 0),
CV_RGB(128,128,128),
CV_RGB(160,160,160),
CV_RGB( 0, 0,255),
CV_RGB( 0,255, 0),
CV_RGB( 0,255,255),
CV_RGB(255, 0, 0),
CV_RGB(255, 0,255),
CV_RGB(255,255, 0),
CV_RGB(255,255,255),
};
Scalar color;
void gamma_correct(Mat& img, Mat& dst, double gamma) {
Mat temp;
CvMat tmp;
img.convertTo(temp, CV_32FC1, 1.0/255.0, 0.0);
tmp=temp;
cvPow(&tmp, &tmp, gamma);
temp.convertTo(dst , CV_8UC1 , 255.0 , 0.0);
}
int main() {
cvNamedWindow("display",1);
img=imread("image.jpg",1);
r.x=img.cols/10;
r.y=img.rows/3;
r.width=img.cols*8/10;
r.height=img.rows*2/3;
smallImg=img(r);
cvtColor(smallImg,gray,CV_BGR2GRAY);
// medianBlur(gray,gray,5);
equalizeHist(gray,gray);
gamma_correct(gray,gray,4.0);
imshow("display",gray);
waitKey(0);
bw=(gray>threshval);
imshow("display",bw);
waitKey(0);
Mat Structure0=getStructuringElement(MORPH_RECT,Size(3,3));
erode(bw,bw,Structure0,Point(-1,-1));
Mat Structure1=getStructuringElement(MORPH_RECT,Size(6,6));
dilate(bw,bw,Structure1, Point(-1,-1));
imshow("display",bw);
waitKey(0);
findContours(bw,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
if (!contours.empty()&&!hierarchy.empty()) {
idx=0;
n=0;
vector<Point> approx;
for (;idx>=0;idx=hierarchy[idx][0]) {
color=colors[idx%15];
// drawContours(smallImg,contours,idx,color,1,8,hierarchy);
approxPolyDP(Mat(contours[idx]), approx, arcLength(Mat(contours[idx]), true)*0.005, true);//0.005为将毛边拉直的系数
const Point* p = &approx[0];
int m=(int)approx.size();
polylines(smallImg, &p, &m, 1, true, color);
circle(smallImg,Point(p[0].x,p[0].y),3,color);
circle(smallImg,Point(p[1].x,p[1].y),2,color);
for (int i=2;i<m;i++) circle(smallImg,Point(p[i].x,p[i].y),1,color);
n++;
if (1==n) {
maxrect=boundingRect(Mat(contours[idx]));
} else {
brect=boundingRect(Mat(contours[idx]));
CvRect mr(maxrect),br(brect);
maxrect=cvMaxRect(&mr,&br);
}
}
circle(smallImg,Point(maxrect.x+maxrect.width/2,maxrect.y+maxrect.height/2),2,CV_RGB(255,0,0));
}
imshow("display",smallImg);
waitKey(0);
cvDestroyWindow("display");
return 0;
}