静止画像中の特定の物体の色を変えたく、まず物体だけを取り出そうと、前景抽出のプログラム(Grabcutを用いました)をopencvで実装してみたのですが、物体じゃない部分も認識されてしまいます(単純な画像ですと、綺麗に前景抽出されます)。
綺麗に前景抽出させたいのですが、他に何か方法が思いつく方は教えて頂きたいです。どうぞ宜しくお願い致します。
C++
1#include"stdafx.h" 2#pragma comment(lib,"opencv_world341d.lib") 3#include <iostream> 4#include<opencv2/opencv.hpp> 5#include<opencv2/core/core.hpp> 6#include<opencv2/highgui/highgui.hpp> 7#include <opencv2/imgproc.hpp> 8 9using namespace cv; 10using namespace std; 11 12int main() 13{ 14 // Open another image 15 Mat image; 16 image = cv::imread("ポスト.bmp"); 17 18 if (!image.data) // Check for invalid input 19 { 20 cout << "Could not open or find the image" << std::endl; 21 return -1; 22 } 23 24 // define bounding rectangle 25 //int border = 100; 26 //int border2 = border + border; 27 //cv::Rect rectangle(100, 100, image.cols - border2, image.rows - border2); 28 cv::Rect rectangle(170, 100, 300, 800); 29 30 cv::Mat result; // segmentation result (4 possible values) 31 cv::Mat bgModel, fgModel; // the models (internally used) 32 33 // GrabCut segmentation 34 cv::grabCut(image, // input image 35 result, // segmentation result 36 rectangle,// rectangle containing foreground 37 bgModel, fgModel, // models 38 1, // number of iterations 39 cv::GC_INIT_WITH_RECT); // use rectangle 40 // Get the pixels marked as likely foreground 41 cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ); 42 // Generate output image 43 cv::Mat foreground(image.size(), CV_8UC3, cv::Scalar(0, 255, 255)); 44 image.copyTo(foreground, result); // bg pixels not copied 45 46 // draw rectangle on original image 47 cv::rectangle(image, rectangle, cv::Scalar(0, 255, 255), 1); 48 cv::namedWindow("Image"); 49 cv::imshow("Image", image); 50 51 // display result 52 cv::namedWindow("Segmented Image"); 53 cv::imshow("Segmented Image", foreground); 54 55 56 waitKey(); 57 return 0; 58 59}
以上がプログラムで、以下が前景抽出前と、抽出後の得られた画像です。
回答1件
あなたの回答
tips
プレビュー