二值化后由于头尾相连,该怎么进行分割,分割出头部和尾部,头大尾小
一种简单的方法是根据二值化后的图像进行形态学处理,通过腐蚀和膨胀来分离头部和尾部。
首先,将图像进行腐蚀操作,使头部的部分更加细长,而尾部的部分更短小。然后,对这个腐蚀后的图像进行膨胀操作,头部的部分会膨胀回来,而尾部则不会膨胀到原来的位置。
在进行腐蚀和膨胀操作时,需要选择合适的结构元素来控制操作的程度。可以通过不断尝试调整结构元素的大小和形状来达到最佳分割效果。
另外,也可以考虑使用机器学习或深度学习方法来分割头部和尾部,但这需要更多的数据和时间成本。
不知道你这个问题是否已经解决, 如果还没有解决的话:需要提前在E盘创建pic文件夹,图片命名由1,2....这样的编号排好
#include<opencv2/opencv.hpp>
using namespace cv;
void main()
{
Mat frame;
char outfile[50];
VideoCapture cap("E:\\2.avi");
if (!cap.isOpened())//打开失败
return;
int totalFrame=cap.get(CV_CAP_PROP_FRAME_COUNT);//获取视频总帧数
for (int i = 1; i <=totalFrame; i++)
{
cap>>frame;
if (frame.empty())
break;
sprintf(outfile,"E:\\pic\\%d.bmp",i);
imwrite(outfile,frame);
imshow("video",frame);
waitKey(15);
}
cap.release();
destroyAllWindows();
}
三、图片合成视频
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void main()
{
VideoWriter writer("E:\\out.avi",CV_FOURCC('X','V','I','D'),20,Size(320,240),true);//Size要和图片尺寸保持一致
char filename[50];
Mat frame;
for (int i = 1; i < 644; i++)
{
sprintf(filename,"E:\\pic\\%d.bmp",i);
frame=imread(filename);
if(frame.empty()) break;
writer<<frame;
}
cout<<"write end!"<<endl;
destroyAllWindows();
}
结果在E盘根目录生成一个out.avi的视频文件,这个目录可以自己改,图片源路径也可以自己改
参考:
【opencv】基于opencv将视频帧转成图片输出_Mr_EvanChen的博客-CSDN博客