У меня есть исходное изображение. Мне нужна отдельная часть, которая будет отделена от нее и сохранена как другое изображение. У меня есть хитрый контур части, которую нужно сегментировать, но как мне использовать ее, чтобы вырезать часть из исходного изображения? Я приложил как исходное изображение, так и набросок обтекаемого края. Пожалуйста, помогите мне и предложите мне решение.
РЕДАКТИРОВАТЬ-1: Александр Кондрацкий, это то, что вы имели в виду, заполняя границу?
РЕДАКТИРОВАТЬ-2: в соответствии с Каннат, я сделал это
Теперь, как разделить области, которые находятся снаружи и внутри контура, на два отдельных изображения?
Редактировать 3 — Я думал о «И маске и исходной картинке с контурными линиями. Так как я использую C, у меня возникли небольшие трудности.
это код, который я использую и: —
hsv_gray = cvCreateImage( cvSize(seg->width, seg->height), IPL_DEPTH_8U, 1 );
cvCvtColor( seg, hsv_gray, CV_BGR2GRAY );
hsv_mask=cvCloneImage(hsv_gray);
IplImage* contourImg =cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
IplImage* newImg=cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
cvAnd(contourImg, hsv_mask,newImg,NULL);
Я всегда получаю ошибку несоответствия размера или типа. Я отрегулировал размер, но не могу настроить тип, поскольку один (hsv_mask) — 1 канал, а остальные — 3 канала.
@ kanat- Я также попробовал твои ограничения, но, похоже, не смог правильно войти в C-формат.
использование cv::findContours
на вашем втором изображении, чтобы найти контур сегмента. Тогда используйте cv::boundingRect
найти ограничивающую рамку для этого сегмента. После этого вы можете создать матрицу и сохранить в ней обрезанную ограничивающую рамку из вашего второго изображения (как я вижу, это двоичное изображение). Для обрезки нужного региона используйте это:
cv::getRectSubPix(your_image, BB_size, cv::Point(BB.x + BB.width/2,
,
BB.y + BB.height/2), new_image)
Тогда вы можете сохранить new_image
с помощью cv::imwrite
, Вот и все.
РЕДАКТИРОВАТЬ:
Если вы нашли только один контур, используйте его (иначе вы будете перебирать элементы найденных контуров). Следующий код показывает шаги, но извините, я не могу проверить это сейчас:
std::vector<std::vector<cv::Point>> contours;
// cv::findContours(..., contours, ...);
cv::Rect BB = cv::boundingRect(cv::Mat(contours[0]));
cv::Mat new_image;
cv::getRectSubPix(your_image, BB.size(), cv::Point(BB.x + BB.width/2,
BB.y + BB.height/2), new_image);
cv::imwrite("new_image_name.jpg", new_image);
Вы можете заполнить границу, созданную детектором канни, и использовать ее в качестве альфа-маски на исходном изображении.