就是把照片中的针和反射的影子的轮廓提取出来,我试了canny边缘检测,跟普通的轮廓提取都不能完整的把轮廓提出来
有没有人可以给点用opencv轮廓提取的思路
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 赵4老师 2022-05-16 11:30关注
仅供参考:
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/imgproc/imgproc_c.h" #include "opencv2\highgui\highgui_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 tmp; img.convertTo(tmp, CV_32FC1, 1.0/255.0, 0.0); pow(tmp, gamma, tmp); tmp.convertTo(dst , CV_8UC1, 255.0, 0.0); } int main() { cvNamedWindow("display",1); img=imread("image.jpg",1); r.x =img.cols*1/10; r.y =img.rows*1/5; r.width =img.cols*8/10; r.height=img.rows*3/5; 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 Structure1=getStructuringElement(MORPH_RECT ,Size(6,6)); Mat Structure1=getStructuringElement(MORPH_ELLIPSE,Size(6,6)); dilate(bw,bw,Structure1, Point(-1,-1)); imshow("display",bw); waitKey(0); Mat Structure0=getStructuringElement(MORPH_RECT ,Size(3,3)); Mat Structure0=getStructuringElement(MORPH_ELLIPSE,Size(3,3)); erode(bw,bw,Structure0,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; mr.x=maxrect.x; mr.y=maxrect.y; mr.width=maxrect.width; mr.height=maxrect.height; CvRect br; br.x=brect.x; br.y=brect.y; br.width=brect.width; br.height=brect.height; 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; }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记
- ¥15 保护模式-系统加载-段寄存器