Template Matching(Image Searching) with a mask for multiple objects - 마스크를 이용해 (배경이 다른) 반복되는 이미지 모두 찾기
OpenCV 2019. 7. 12. 16:53 |Only two matching methods currently accept a mask: CV_TM_SQDIFF and CV_TM_CCORR_NORMED
The mask should have a CV_8U or CV_32F depth and the same number of channels and size as the target image. In CV_8U case, the mask values are treated as binary, i.e. zero and non-zero. In CV_32F case, the values should fall into [0..1] range and the target image pixels will be multiplied by the corresponding mask pixel values.
OpenCV matchTemplate 함수에 마스크를 적용해서 (배경이 다른) 같은 이미지를 모두 찾을 수 있다. 마스크는 CV_8U 아니면 CV_32F의 깊이값을 가져야 하며 target image와 같은 채널 수와 사이즈를 가져야 한다.
2019/07/08 - [Software/OpenCV] - Template Matching(Image Searching) - 부분 이미지 검색
<Target>
<Mask>
<Source>
There are 3 objects(bones) to find in the source image.
Each of them has a different background as below.
Below code explains how to spot different background multiple objects with a mask.
Adjust threshold value if it doesn't work properly.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <opencv2/opencv.hpp> #include <time.h> using namespace cv; using namespace std; int main() { clock_t start, end; double minVal; Point minLoc; double threshold = 0.001; int count = 0; Mat FinalImage = imread("source.png", IMREAD_COLOR); if (FinalImage.empty()) return -1; // Grayscale source, target and mask for faster calculation. Mat SourceImage; cvtColor(FinalImage, SourceImage, CV_BGR2GRAY); Mat TargetImage = imread("target.png", IMREAD_GRAYSCALE); if (TargetImage.empty()) return -1; Mat Mask = imread("mask.png", IMREAD_GRAYSCALE); if (Mask.empty()) return -1; Mat Result; start = clock(); // Mask must have the same datatype and size with target image. // It is not set by default. Currently, only the TM_SQDIFF and TM_CCORR_NORMED methods are supported. matchTemplate(SourceImage, TargetImage, Result, TM_SQDIFF, Mask); // Type of the template matching operation: TM_SQDIFF normalize(Result, Result, 0, 1, NORM_MINMAX, -1, Mat()); minMaxLoc(Result, &minVal, NULL, &minLoc, NULL); for (int i = 0; i < Result.rows; i++) for (int j = 0; j < Result.cols; j++) if (Result.at<float>(i, j) < threshold) { rectangle(FinalImage, Point(j, i), Point(j + TargetImage.cols, i + TargetImage.rows), Scalar(0, 0, 255), 1); count++; } end = clock(); cout << "Searching time: " << difftime(end, start) / CLOCKS_PER_SEC << endl; cout << "Minimum Value: " << minVal << " " << minLoc << endl; cout << "Threshold: " << threshold << endl; cout << "Found: " << count << endl; imshow("Mask", Mask); imshow("TargetImage", TargetImage); imshow("Result", Result); imshow("FinalImage", FinalImage); waitKey(0); return 0; } | cs |
Grayscale target image
Binary mask
Result image
Final image
Found 3 bones in 0.097 secs.
'OpenCV' 카테고리의 다른 글
Random Number Generator(RNG) - OpenCV 난수 발생기 사용 (0) | 2019.07.13 |
---|---|
cv::String class usage examples - OpenCV 문자열 클래스 사용 예제 (0) | 2019.07.13 |
Template Matching(Image Searching) for multiple objects - 반복되는 이미지 모두 찾기 (2) | 2019.07.10 |
Template Matching(Image Searching) - 부분 이미지 검색 (0) | 2019.07.08 |
OpenCV VideoCapture class for playing image sequence like a video file (0) | 2019.07.02 |