【结论】:
对于opencv2.4.3 使用vs2010建立工程,然后使用vs2017打开,打开后并不升级程序,这样依然使用的是vs2010的sdk,只不过是使用vs2017这个工具开发。
直接使用vs2017 并配合opencv2.4.3时 会有很多问题,最好不要这样操作。
mat的地址如果是绝对地址,则要// 两个
string strPath = "e://test.bmp";
Mat mat = imread(strPath);
opencv 读取固定地址的图像时mat为空
cv::Mat mat1 = cv::imread("./20201029-104759.jpg");
if (mat1.empty())
{
return;
}
用上面读取时发现 mat为空,使用绝对位置,而且带两个双斜杠才可以。
解决办法:
cv::Mat mat1 = cv::imread("E://wokspace//excercise//TestOpencv_MFC//Debug//20201029-104759.jpg");
if (mat1.empty())
{
return;
}
参考:https://blog.csdn.net/im6520/article/details/75103651?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
opencv中 图片保存
图片格式有些是自带压缩格式的,bmp没有任何压缩,jpg是自带压缩
https://www.cnblogs.com/skyfsm/p/7136709.html
MFC中使用CvvImage显示相机数据,发现界面图像与相机保存的图像相反,
如图:左图为 相机界面显示 右图为相机保存数据显示
方法一: 添加origin =1
m_IplImage = cvCreateImageHeader(cvSize(sFrameHead.iWidth, sFrameHead.iHeight), IPL_DEPTH_8U, sFrameHead.uiMediaType == CAMERA_MEDIA_TYPE_MONO8 ? 1 : 3);
m_IplImage->origin = 1;//默认为1,2020.10.29 如果没有此句,相机界面显示的图像 与 保存的图像是进行翻转过的
cvSetData(m_IplImage, m_pFrameBuffer, sFrameHead.iWidth*(sFrameHead.uiMediaType == CAMERA_MEDIA_TYPE_MONO8 ? 1 : 3));
添加一句 m_IplImage->origin = 1;解决问题
参考【MFC两种视频图像採集方法】DirectShow与Opencv
https://www.cnblogs.com/mfrbuaa/p/5125392.html:
https://blog.csdn.net/hamburry/article/details/40456343
方法二: cvCreateImageHeader 创建的origin 默认为0,而从摄像头读取的数据 origin为1,数据扫描是从下往上,左下为原始。 为了配合创建默认为0的东西,需要相机进行水平镜像就可以了,这样就实现了方向从上到下。
https://blog.csdn.net/fightingforcv/article/details/19476591
IplImage图像与BYTE图像
https://blog.csdn.net/jnulzl/article/details/48139993
cvSaveImage保存图像:
只有8位单通道或者三通道,如果深度、通道、格式不对的话,要使用cvCvtScale 和 cvCvtColor来进行转换。
https://blog.csdn.net/chenaini119/article/details/21037403?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242
如果图片上画线时,颜色不是彩色,需要将灰度图转化为 rgb图
IplImage *pImage = NS_CV_HELPER::CvCreateImage(cvGetSize(plImage), IPL_DEPTH_8U, 3);
NS_CV_HELPER::CvCvtColor(plImage, pImage, CV_GRAY2RGB);
使用fitEllipse 拟合椭圆时,程序崩溃。
RotatedRect ellipse_rect = fitEllipse(contours[i]); 进行拟合时,程序崩溃
解析: 椭圆拟合最低好像五个点,所以对五个点一下的是不能进行拟合的
findContours_new(bina, contours, hie, RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, Point(0, 0));
int contours_size = contours.size();
for (int i = 0; i < contours_size; i++) {
//2020.11.10 add 椭圆拟合不小于5个点
if (contours.at(i).size() <= 5)
{
continue;
}
RotatedRect ellipse_rect = fitEllipse(contours[i]);
。。。。。。。。
OpenCV 应用fitEllipse函数一种异常问题分析
https://blog.csdn.net/chaipp0607/article/details/53998116
findContours函数
findContours函数在VS2010中运行没问题,但在VS2017中运行有问题,需要修改该函数。
fitEllipse函数 处程序崩溃
fitEllipse函数在拟合 椭圆时,**必须有5个点以上才可以,**否则程序崩溃。
if (contours.at(i).size() <= 5)
{
continue;
}
在mat图像上画 圆 画点
cv::circle(bin_src, final_sort_ellipse_list[3], 10, cv::Scalar(255, 0, 0), 10);
相机图像传输
使用迈德威视的千兆网口相机,其中图像传输 所占网络100% 是因为图像太大了,大小为2448*2048 ,cpu占用率很高,可以尝试将图像大小降低下来,测试一下。
两个矩形的交集与并集
Rect rt3 = rt1 & rt2; //交集 两个矩形的交集
Rect rt4 = rt1 | rt2;//并集 两个矩形的并集
颜色
Scalar(255, 0 , 0) 表示 BGR alpha
Mat类型 Iplimage类型
opencv 1.0中图像存储为IplImage 这个使用时需要开辟 和释放指针,而oepnc2.0以上的版本进行了优化,使用Mat类型,就不用自己进行释放指针了,简化了操作。