#include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace std; using namespace cv; void hist_xy(Mat imgsrc,int *ax,int *ay); int main() { //getImage Mat imgsrc=imread("E:\\01project\\02find_rect\\01imageSrc\\image_39.jpg"); imwrite("E:\\01imgsrc.jpg",imgsrc); //分离rgb vector<Mat> vRGB; split(imgsrc,vRGB); Mat imgRed=Mat::zeros(imgsrc.size(),CV_8UC1); imgRed=vRGB.at(2)-vRGB.at(1); imgRed=imgRed-vRGB.at(0); for(int i=0;i<imgRed.rows;i++) { for (int j=0;j<imgRed.cols;j++) { if(!((i<imgRed.rows/4 && j<imgRed.cols/4) || (i>imgRed.rows*3/4 && j>imgRed.cols*3/4))) { imgRed.at<uchar>(i,j)=0; } } } imwrite("E:\\02imgr.jpg",imgRed); Mat imgbw=Mat::zeros(imgsrc.size(),CV_8UC1); //cv::adaptiveThreshold(imgRed,imgbw,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,51,15); //adaptiveThreshold(imgRed,imgbw, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV,151,5); cv::threshold(imgRed,imgbw,CV_THRESH_OTSU,255,THRESH_BINARY); imwrite("E:\\03imgbw.jpg",imgbw); //正交投影 int *xh=new int[imgbw.rows]; int *yh=new int[imgbw.cols]; hist_xy(imgbw,xh,yh); // for (int i=0;i<imgbw.rows;i++) // { // for (int j=0;j<imgbw.cols;j++) // { // // if (xh[i]>0) // { // for (int k=0;k<xh[i];k++) // { // imgsrc.at<Vec3b>(i,k)[0]=0; // imgsrc.at<Vec3b>(i,k)[1]=0; // imgsrc.at<Vec3b>(i,k)[2]=255; // } // } // if (yh[j]>0) // { // for (int k=0;k<yh[j];k++) // { // imgsrc.at<Vec3b>(k,j)[0]=0; // imgsrc.at<Vec3b>(k,j)[1]=0; // imgsrc.at<Vec3b>(k,j)[2]=255; // } // } // } // } // imwrite("E:\\04投影.jpg",imgsrc); //连续5个以上的像素点大于100进入条件 // Point px1=(0,0);//从中间开始寻找第一个连续5行5列>100的点 for (int i=imgbw.rows/2;i<imgbw.rows-4;i++) { if (xh[i-2]>100 && xh[i-1]>100 && xh[i]>100 && xh[i+1]>100 && xh[i+2]>100) { px1.y=i; break; } } for (int i=imgbw.cols/2;i<imgbw.cols-4;i++) { if (yh[i-2]>100 && yh[i-1]>100 && yh[i]>100 && yh[i+1]>100 && yh[i+2]>100) { px1.x=i; break; } } Point px2=(0,0);//从中间开始寻找第一个连续5行5列>100的点 for (int i=imgbw.rows/2;i>4;i--) { if (xh[i-2]>100 && xh[i-1]>100 && xh[i]>100 && xh[i+1]>100 && xh[i+2]>100) { px2.y=i; break; } } for (int i=imgbw.cols/2;i>4;i--) { if (yh[i-2]>100 && yh[i-1]>100 && yh[i]>100 && yh[i+1]>100 && yh[i+2]>100) { px2.x=i; break; } } for(int i=0;i<imgbw.rows;i++) { for (int j=0;j<imgbw.cols;j++) { if (i>px2.y && i<px1.y && j>px2.x && j<px1.x) { imgsrc.at<Vec3b>(i,j)[0]=0; imgsrc.at<Vec3b>(i,j)[1]=1; imgsrc.at<Vec3b>(i,j)[2]=255; } } } if (px1.x==0 || px1.y==0 ||px2.x==0 || px2.y==0 || abs(px2.x-px1.x)<2300 ||abs(px2.y-px1.y)<1600) { cout<<"cannot find the Rect"<<endl; getchar(); } imwrite("E:\\04投影.jpg",imgsrc); return 0; } //投影函数xy平面 void hist_xy(Mat imgsrc,int *ax,int *ay) { //int *ax=new int[imgsrc.rows]; int xtemp; //int *ay=new int[imgsrc.cols]; int ytemp; for (int i=0;i<imgsrc.rows;i++) { ax[i]=0; xtemp=0; for (int j=0;j<imgsrc.cols;j++) { if (imgsrc.at<uchar>(i,j)==255) { xtemp++; } } ax[i]=xtemp; } for (int j=0;j<imgsrc.cols;j++) { ay[j]=0; ytemp=0; for (int i=0;i<imgsrc.rows;i++) { if (imgsrc.at<uchar>(i,j)==255) { ytemp++; } } ay[j]=ytemp; } //delete ax; //delete ay; }
时间: 2024-10-10 08:01:55