opencv 자동 광학 검 측,목표 분할 및 검 측(연결 영역 과 find Contours)

절 차 는 다음 과 같다.
1.그림 회색 화;
2.중간 값 필터 소음 제거
3.그림 의 빛 과 그림자 구하 기(자동 광학 검 측)
4.빛 빼 기
5.한도 값 조작
6.세 가지 목표 검 측 방법 을 실현 했다.
주로 두 가지 연결 구역 과 find Contours 로 나 뉜 다.
과정 에 오류 가 발생 한 것 은 주로 그림 이 회색 처 리 를 잊 어 버 리 고 무 작위 색상 의 문제 이다.다음 코드 는 모두 해결 되 었 습 니 다.
이것 은 find Contours 의 효과 입 니 다.

다음은 연결 구역 의 결과 입 니 다.

#include <opencv2\core\utility.hpp>

#include <opencv2\imgproc.hpp>
#include <opencv2\highgui.hpp>
#include<opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\core\matx.hpp>
#include<string>
#include <iostream>
#include <limits>
using namespace std;
using namespace cv;
Mat img = imread("C:\\Users\\hasee\\Desktop\\luosi.jpg",0);
Mat removeLight(Mat imge, Mat pattern, int method);
Mat calculateLightPattern(Mat img);
static Scalar randomColor(RNG& rng);

void ConnectedComponents(Mat img);
void ConnectedComponetsStats(Mat img);
void FindContoursBasic(Mat img);
void main()
{
Mat img_noise;
medianBlur(img,img_noise,3);
Mat pattern = calculateLightPattern(img_noise);

Mat re_light = removeLight(img_noise, pattern, 1);

Mat img_thr;
threshold(re_light,img_thr,30,255,THRESH_BINARY);

//ConnectedComponents(img_thr);
ConnectedComponetsStats(img_thr);
//FindContoursBasic(img_thr);
waitKey(0);

}
Mat removeLight(Mat imge, Mat pattern, int method) {
Mat aux;
if (method == 1) {
Mat img32, pattern32;
imge.convertTo(img32, CV_32F);
pattern.convertTo(pattern32, CV_32F);
aux = 1 - (img32 / pattern32);
aux = aux * 255;
aux.convertTo(aux, CV_8U);
}
else {
aux = pattern - imge;
}
return aux;
}

Mat calculateLightPattern(Mat img) {
Mat pattern;
blur(img, pattern, Size(img.cols / 3, img.cols / 3));
return pattern;
}
static Scalar randomColor(RNG& rng)
{
int icolor = (unsigned)rng;
return Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255);
}
void ConnectedComponents(Mat img) {
Mat lables;
int num_objects = connectedComponents(img, lables);

if (num_objects < 2) {
cout << "      " << endl;
return;
}
else {
cout << "        : " << num_objects - 1 << endl;
}
Mat output = Mat::zeros(img.rows,img.cols,CV_8UC3);
RNG rng(0xFFFFFFFF);

for (int i = 1; i < num_objects;i++) {
Mat mask = lables == i;
output.setTo(randomColor(rng),mask);
}
imshow("Result",output);
}

void ConnectedComponetsStats(Mat img) {
Mat labels, stats, centroids;
int num_objects = connectedComponentsWithStats(img,labels,stats,centroids);
if (num_objects<2) {
cout << "      " << endl;
return;
}
else {
cout << "        : " << num_objects - 1 << endl;
}
Mat output = Mat::zeros(img.rows, img.cols, CV_8UC3);
RNG rng(0xFFFFFFFF);
for (int i = 1; i < num_objects; i++) {
Mat mask = labels == i;
output.setTo(randomColor(rng), mask);
stringstream ss;
ss << "area: " << stats.at<int>(i,CC_STAT_AREA);
putText(output,ss.str(), centroids.at<Point2d>(i),FONT_HERSHEY_SIMPLEX,0.4,Scalar(255,255,255));
}
imshow("Result", output);
}

void FindContoursBasic(Mat img) {
vector<vector<Point>> contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
Mat output = Mat::zeros(img.rows, img.cols, CV_8UC3);
if (contours.size()==0) {
cout << "      " << endl;
return;
}else{
cout << "       : " << contours.size() << endl;
}
RNG rng(0xFFFFFFFF);
for (int i = 0; i < contours.size(); i++)
drawContours(output,contours,i,randomColor(rng));
imshow("Result", output);
}
추가 지식:SURF 특징 점 검 측 과 일치 하 는 오류 일치 점 삭제
SURF 특징 점 검 측 과 일치 하 는 오류 일치 점 삭제
SURF(Speeded Up Robust Feature)는 가속 판 의 노 봉 성 을 가 진 알고리즘 으로,SIFT 알고리즘 의 가속 판이 다.
그러나 SURF 특징 이 일치 한 후 대량의 오류 일치 점 이 있 으 므 로 이러한 오류 일치 점 을 삭제 해 야 합 니 다.
SURF 원리 등 을 이론 적 으로 설명 하지 않 고 직접 용법 을 말한다.
특징 이 일치 하 는 절 차 는 세 단계 로 나 뉜 다.
1.특징 점 찾기
2.특징 점 설명
3.특징 점 일치
구체 적 인 기본 코드 는 마지막 으로 보 자.구체 적 으로 는 모 성운 의 책 을 볼 수 있 지만 개인 적 으로 프로 그래 밍 스타일 이 엄밀 하지 않 고 자신 이 변경 했다 고 생각 합 니 다.
그러나 일치 하 는 결 과 는 다음 과 같다.

잘못된 일치 점 이 많 습 니 다.잘못된 일치 점 을 어떻게 삭제 합 니까?
양 방향 일치 거리 제약.
실험 결 과 는 다음 과 같다.효 과 는 여전히 매우 좋다.

#include "stdafx.h" 
#include <opencv2\opencv.hpp> 
#include <opencv2
onfree
onfree.hpp> #include <opencv2\legacy\legacy.hpp> #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { // cv::Mat srcImg1 = cv::imread("1.jpg", 1); cv::Mat srcImg2 = cv::imread("2.jpg", 1); if (srcImg1.empty() || srcImg2.empty()) { std::cout << "Read Image ERROR!" << std::endl; return 0; } //SURF int minHessian = 700; cv::SurfFeatureDetector detector(minHessian);// std::vector<cv::KeyPoint> keyPoint1, keyPoint2;// , detector.detect(srcImg1, keyPoint1); detector.detect(srcImg2, keyPoint2); // cv::SurfDescriptorExtractor extrator;// cv::Mat descriptor1, descriptor2;// extrator.compute(srcImg1, keyPoint1, descriptor1); extrator.compute(srcImg2, keyPoint2, descriptor2); //BruteForce cv::BruteForceMatcher <cv::L2<float>>matcher;// std::vector <cv::DMatch> matches; matcher12.match(descriptor1, descriptor2, matches); // cv::Mat imgMatch; cv::drawMatches(srcImg1, keyPoint1, srcImg2, keyPoint2, matches, imgMatch); cv::namedWindow(" ", CV_WINDOW_AUTOSIZE); cv::imshow(" ", imgMatch); cv::imwrite(" .jpg", imgMatch); cv::waitKey(10); return 0; }
이상 의 이 평론 은 opencv 자동 광학 검 측,목표 분할 과 검 측(연결 구역 과 find Contours)이 모두 에 게 공 유 된 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 많은 응원 을 바 랍 니 다.

좋은 웹페이지 즐겨찾기