精华内容
下载资源
问答
  • colors.txt5.Opencv调用mask rcnn总结 1. ckpt转pb文件 cd C:\Users\Administrator\Desktop\Tensorflow\ObjectDetection\models\research\object_detection python export_inference_graph.py --input_type=image_...

    1 目录结构

    接着上一小节继续做,在log文件夹中新建out文件夹。
    在这里插入图片描述

    2 ckpt转pb文件

    上一节中num_steps = 200,当设置num_steps = 200000时
    在这里插入图片描述

    cd C:\Users\Administrator\Desktop\Tensorflow\ObjectDetection\models\research\object_detection
    python export_inference_graph.py --input_type=image_tensor --pipeline_config_path="C:/Users/Administrator/Desktop/opmask/mask/mask_rcnn_inception_v2_coco_2018_01_28/mask_rcnn_inception_v2_coco.config" --trained_checkpoint_prefix="C:/Users/Administrator/Desktop/opmask/mask/log/model.ckpt-200000" --output_directory="C:/Users/Administrator/Desktop/opmask/mask/log/out"
    

    3 生成pbtxt文件

    找到opencv中sources/samples/dnn模块中tf_text_graph_mask_rcnn.py,复制并重命名为tf_text_graph_mask_rcnn_me.py,修改文件中的下述路径。
    parser.add_argument('--input', default='C:/Users/Administrator/Desktop/opmask/mask/log/out/frozen_inference_graph.pb', help='Path to frozen TensorFlow graph.')
    parser.add_argument('--output', default='C:/Users/Administrator/Desktop/opmask/mask/log/out/mask_rcnn.pbtxt', help='Path to output text graph.')
    parser.add_argument('--config', default='C:/Users/Administrator/Desktop/opmask/mask/mask_rcnn_inception_v2_coco_2018_01_28/mask_rcnn_inception_v2_coco.config', help='Path to a *.config file is used for training.')
    args = parser.parse_args()
    
    cd C:\Users\Administrator\Desktop\opencv4\opencv\sources\samples\dnn
    python tf_text_graph_mask_rcnn_me.py
    

    4 mscoco_labels.names

    0.0
    0.4
    0.8
    1.2
    1.6
    point
    

    5 colors.txt

    0 255 0
    0 0 255
    255 0 0
    0 255 255
    255 255 0
    255 0 255
    

    6 Opencv调用mask rcnn

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string.h>
    
    #include <opencv2/dnn.hpp>
    #include <opencv2/imgproc.hpp>
    #include <opencv2/highgui.hpp>
    
    using namespace std;
    using namespace cv;
    using namespace dnn;
    
    
    float confThreshold = 0.4;
    float maskThreshold = 0.3;
    
    vector<string> classes;
    vector<Scalar> colors;
    
    void postprocess(Mat &frame, const vector<Mat> &outs);
    void drawBox(Mat & frame, int classId, float conf, Rect box, Mat & objectMask);
    
    
    int main()
    {
    	int read_file = 0;
    
    	//读取mscoco_labels.names
    	string classesFile = "C:/Users/Administrator/Desktop/opmask/mask/log/out/mscoco_labels.names";
    	ifstream ifs(classesFile.c_str());
    	string line;
    	while (getline(ifs,line))
    	{
    		classes.push_back(line);
    	}
    
    	//读取colors.txt
    	string colorsFile = "C:/Users/Administrator/Desktop/opmask/mask/log/out/colors.txt";
    	ifstream colorFptr(colorsFile.c_str());
    	while (getline(colorFptr,line))
    	{
    		char * pEnd;
    		double r, g, b;
    		r = strtod(line.c_str(), &pEnd);
    		g = strtod(pEnd, NULL);
    		b = strtod(pEnd, NULL);
    		Scalar color = Scalar(r, g, b, 255.0);
    		colors.push_back(Scalar(r, g, b, 255.0));
    	}
    
    	//加载frozen_inference_graph.pb和mask_rcnn.pbtxt
    	string textGraph = "C:/Users/Administrator/Desktop/opmask/mask/log/out/mask_rcnn.pbtxt";
    	String modelWeights = "C:/Users/Administrator/Desktop/opmask/mask/log/out/frozen_inference_graph.pb";
    
    	//导入tensorflow模型
    	Net net = readNetFromTensorflow(modelWeights,textGraph);
    	net.setPreferableBackend(DNN_BACKEND_OPENCV);
    	net.setPreferableTarget(DNN_TARGET_CPU);
    
    	string str, outputFile;
    	VideoCapture cap;
    	VideoWriter video;
    	Mat frame, blob;
    
    	//异常处理  try...catch...
    	try
    	{
    		outputFile = "mask_rcnn_out_cpp.avi";
    		
    		//读取图片测试
    		if (read_file == 0)
    		{
    			str = "C:/Users/Administrator/Desktop/opmask/mask/log/out/000083.jpg";
    			ifstream ifile(str);
    			if (!ifile)
    			{
    				throw("error");
    			}
    			frame = imread(str);
    			str.replace(str.end() - 4, str.end(), "_mask_rcnn_out.jpg");
    			outputFile = str;
    		}
    		
    		//读取视频文件
    		else if (read_file ==1)
    		{
    			str = "./image/cars.mp4";
    			ifstream ifile(str);
    			if (!ifile)
    			{
    				throw("error");
    			}
    			cap.open(str);
    			str.replace(str.end() - 4, str.end(), "_mask_rcnn_out.avi");
    			outputFile = str;
    		}
    
    		//读取摄像头,实时监测
    		else
    		{
    			cap.open(0);
    		}
    
    	}
    	catch (...)
    	{
    		cout << "Could not open the input image/video stream" << endl;
    		return 0;
    	}
    
    	if (read_file != 0)
    	{
    		video.open(outputFile, VideoWriter::fourcc('M', 'J', 'P', 'G'), 28,
    			Size(cap.get(CAP_PROP_FRAME_WIDTH), cap.get(CAP_PROP_FRAME_HEIGHT)));
    	}
    
    	//定义静态常量
    	static const string kWinName = "Deep learning object detection in Opencv";
    
    	//处理图像
    	while (waitKey(1)<0)
    	{
    		if (read_file != 0)
    		{
    			//获取单帧图像
    			cap >> frame;
    		}
    
    		if (frame.empty())
    		{
    			cout << "Done processing !!!" << endl;
    			cout << "Output file is stored as " << outputFile << endl;
    			waitKey(0);
    			break;
    		}
    
    		//获得深度学习的输入图像
    		blobFromImage(frame, blob, 1.0, Size(frame.cols, frame.rows), Scalar(), true, false);
    
    		//设置输入
    		net.setInput(blob);
    
    		//获得输出层
    		vector<String> outNames(2);
    		outNames[0] = "detection_out_final";
    		outNames[1] = "detection_masks";
    		vector<Mat> outs;
    		net.forward(outs, outNames);
    
    		//提取预测框和掩膜
    		postprocess(frame, outs);
    
    		vector<double>layersTimes;
    		double freq = getTickFrequency() / 1000;
    		double t = net.getPerfProfile(layersTimes) / freq;
    		string label = format("Mask-RCNN Inference time for a frame : %0.0f ms", t);
    		putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
    
    		//保存结果
    		Mat detectedFrame;
    		frame.convertTo(detectedFrame, CV_8U);
    		namedWindow(kWinName, WINDOW_NORMAL);
    		imshow(kWinName, frame);
    		imwrite("C:/Users/Administrator/Desktop/1.jpg", frame);
    		waitKey(20);
    
    		//退出
    		if (waitKey(1000)== 27)
    		{
    			break;
    		}
    
    		if (read_file == 0)
    		{
    			imwrite(outputFile, detectedFrame);
    			break;
    		}
    		else
    		{
    			video.write(detectedFrame);
    		}
    
    	}
    
    	cap.release();
    	//释放生成的视频
    	if (read_file != 0)
    	{
    		video.release();
    	}
    
    	waitKey(0);
    	return 0;
    }
    
    
    void postprocess(Mat &frame, const vector<Mat> &outs)
    {
    	//预测框结果
    	Mat outDetections = outs[0];
    	
    	//掩膜结果
    	Mat outMasks = outs[1];
    
    	//预测框个数
    	const int numDetections = outDetections.size[2];
    
    	//类别数
    	const int numClasses = outMasks.size[1];
    
    	outDetections = outDetections.reshape(1, outDetections.total() / 7);
    
    	//筛选预测框数
    	for (int i = 0; i < numClasses; ++i)
    	{
    		//提取预测框置信度
    		float score = outDetections.at<float>(i, 2);
    
    		//超过阈值
    		if (score>confThreshold)
    		{
    			//类别
    			int classId = static_cast<int>(outDetections.at<float>(i, 1));
    			int left = static_cast<int>(frame.cols * outDetections.at<float>(i, 3));
    			int top = static_cast<int>(frame.rows * outDetections.at<float>(i, 4));
    			int right = static_cast<int>(frame.cols * outDetections.at<float>(i, 5));
    			int bottom = static_cast<int>(frame.rows * outDetections.at<float>(i, 6));
    
    
    			//防止框画在外面
    			left = max(0, min(left, frame.cols - 1));
    			top = max(0, min(top, frame.rows - 1));
    			right = max(0, min(right, frame.cols - 1));
    			bottom = max(0, min(bottom, frame.rows - 1));
    			Rect box = Rect(left, top, right - left + 1, bottom - top + 1);
    
    			//提取
    			Mat objectMask(outMasks.size[2], outMasks.size[3], CV_32F, outMasks.ptr<float>(i, classId));
    
    			//画框
    			drawBox(frame, classId, score, box, objectMask);
    		}
    	}
    }
    
    
    void drawBox(Mat & frame, int classId, float conf, Rect box, Mat & objectMask)
    {
    	//画预测框
    	rectangle(frame, Point(box.x, box.y), Point(box.x + box.width, box.y + box.height), Scalar(255, 178, 50), 3);
    
    	//置信度获取
    	string label = format("%.2f", conf);
    
    	//获取标签
    	if (!classes.empty())
    	{
    		CV_Assert(classId < (int)classes.size());
    		label = classes[classId] + ":" + label;
    	}
    
    	int baseLine;
    	Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
    	box.y = max(box.y, labelSize.height);
    
    	//画框打标签
    	rectangle(frame, Point(box.x, box.y - round(1.5 * labelSize.height)), Point(box.x + round(1.5 * labelSize.width), box.y + baseLine), Scalar(255, 255, 255), FILLED);
    	putText(frame, label, Point(box.x, box.y), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 0), 1);
    
    	//填充颜色
    	Scalar color = colors[classId % colors.size()];
    
    	//重置大小
    	resize(objectMask, objectMask, Size(box.width, box.height));
    	Mat mask = (objectMask > maskThreshold);
    
    	//叠加获得颜色掩膜
    	Mat coloredRoi = (0.3 * color + 0.7 * frame(box));
    	coloredRoi.convertTo(coloredRoi, CV_8UC3);
    
    	//画轮廓
    	vector<Mat> contours;
    	Mat hierarchy;
    	mask.convertTo(mask, CV_8U);
    	findContours(mask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
    	drawContours(coloredRoi, contours, -1, color, 5, LINE_8, hierarchy, 100);
    	coloredRoi.copyTo(frame(box), mask);
    }
    
    

    总结

    结果就不显示了,主要记录过程,一张图用了8s左右,有点慢,原因是该程序是用cpu做的,找个时间研究一下怎么用gpu做。

    展开全文
  • OpenCV利用Mask获取图像的不规则区域

    热门讨论 2011-08-03 13:17:06
    OpenCV利用Mask方法,获取图像的不规则区域
  • OpenCV掩码mask

    2018-06-21 18:54:24
    mask--掩码:是一个单通道图像(二值图/灰度图)掩码的某个位置为0,则在此通道位置上的操作不起作用掩码的某个位置如果不为0,则在此位置的操作会起作用...

    mask--掩码:是一个单通道图像(二值图/灰度图)

    掩码的某个位置为0,则在此通道位置上的操作不起作用

    掩码的某个位置如果不为0,则在此位置的操作会起作用

    展开全文
  • opencvmask参数

    千次阅读 2018-11-08 15:35:29
    其实opencv 里面很多函数都是会带有一个mask 参数的,很多同学都不知道它到底有什么用,好像在实际运用中忽略它也没有什么问题(这不废话嘛,opencv设计师设计它的时候默认就是可以忽略的)。 我在这里就抛砖引玉,...

    其实opencv 里面很多函数都是会带有一个mask 参数的,很多同学都不知道它到底有什么用,好像在实际运用中忽略它也没有什么问题(这不废话嘛,opencv设计师设计它的时候默认就是可以忽略的)。

    我在这里就抛砖引玉,详细分析一个常用函数cvcopy里面的mask ,希望可以给大家一点点指引。

    cvCopy 这个函数很熟洗哈,用得很多吧哈哈…… 以下内容来子opencv安装文件夹中自带的pdf文档。

    Copies one array to another.

    //复制一个数组到另外一个数组

    void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL);

    src The source array

    //源数组,要复制谁??from whom?

    //插两句题外话,opencv里面提到的数组不是通常意义上的数组,它是矩阵、图像等结构体……

    dst The destination array

    //目标数组,复制以后的内容给谁?? to whom?

    mask

    ——下面这就是重点。鄙人认为很多人都没有深刻理解这个mask的作用(不要拿鞋仍我……)——

    Operation mask, 8-bit single channel array; specifies elements of the destination array to
    be changed

    //掩码操作,mask是一个8位单通道的数组;mask指定了目标数组(dst)中那些元素是可以改变的

    上面这句话还不是非常重点,重点是以下的那个公式,这个公式有多少人理解哈,就网上的资料来看很少有人理解,又或者高手都不屑于网上写东西,所以我们只能做等真相……孩子,你被mask mask住了吗 (第一个mask是opencv里面的mask数组,第二个mask是这个英文词本身的意思,不懂就google去)??真相来了!!!

    The function copies selected elements from an input array to an output array:
    dst(I) = src(I) if mask(I) = 0.

    //该函数把输入数组(src数组)中选中的元素(可以认为是做了标记的,不过这些标志是谁来做的呢??对,就是mask,孩子你太聪明了)拷贝到…………………………………………………………………………

    ………………………………………………………………到哪里?快说!!拷贝到dst数组嘛……

    dst(I) = src(I) if mask(I) != 0.

    就是说,如果mask不是NULL,也就是说mask是一个数组,并且是一个和dst or src大小完全一致的数组。

    遍历src的每一个元素,

    (1)在位置i时候如果mask对应的值为不为0,那么把src (i) 的值复制给dst (i) 。

    (2)如果mask(i) 为0,那么不管src(i)是什么,dst(i)都设置为0.

    举例说明,这里不举太复杂的就来一个一维的就够啦。

    If any of the passed arrays is of IplImage type, then its ROI and COI fields are used. Both
    arrays must have the same type, the same number of dimensions, and the same size. The function
    can also copy sparse arrays (mask is not supported in this case).

    //如果传递给src的数组是图像类型的,那么将使用ROI或者COI。src数组和dst数组必须具有相同的数据类型、一致的数组维数、一样的大小。该函数也可以用于拷贝稀疏矩阵(但是此种情况下,mask不起作用)。

    好吧,到这里了终于写完了。你现在是不是明白为什么要起mask这个名字了吧,掩码就是:不为0的时候就可一操作(具体是什么操作就看具体的函数了)、为0就掩盖住了无法操作。

    补充一点 :mask = NULL 意思就是没有模板、不使用掩码操作,函数该干啥就干啥……

    来吧,再来一个有血有肉的活生生的例子(本文在opencv上的回复) :

        #include "cv.h"
        #include "cxcore.h"
        #include "highgui.h"
        #include <stdio.h>
        int main()
        {
           float arr1[] = {1,2,3,4,5,6,};
           float arr2[] = {-4,78,12,154,786,-0.154};
           float arr3[6] = {119} ;
           int mask_arr[6] = {1};
           CvMat src1;
           cvInitMatHeader(&src1,2,3,CV_32FC1,arr1,CV_AUTOSTEP);
           CvMat src2 ;
           cvInitMatHeader(&src2,2,3,CV_32FC1,arr2,CV_AUTOSTEP);
           CvMat dst ;
           cvInitMatHeader(&dst,2,3,CV_32FC1,arr3,CV_AUTOSTEP);
           CvMat *mask = cvCreateMat( 2,3,CV_32FC1 );
           cvInitMatHeader(mask,2,3,CV_8UC1,mask_arr,CV_AUTOSTEP);
           cvAdd(&src1, &src2, &dst, mask);
           int x ;
           int y ;
           for( y = 0 ; y < 2;++y )
           {
              float* ptr = (float*) ( dst.data.ptr + y * dst.step ) ;
              for ( x = 0; x < 3 ; x++ )
              {
                 printf("/t%f",ptr[x]);
              }
              printf("/n");
           }
           printf("/n");
           return 0 ;
        } 
    

    结果如下:
    -3.000000 0.000000 0.000000
    0.000000 0.000000 0.000000

    展开全文
  • opencvmask的作用

    千次阅读 2017-09-25 15:18:02
    opencvmask的作用就是创建感兴趣区域,即待处理的区域。  通常,mask大小创建分为两步,先创建与原图一致,类型为CV_8UC1或者CV_8UC3的全零图(即黑色图)。如mask = Mat::zeros(image.size(),CV_8UC1);   ...

           在图像处理的过程中,我们时常需要对指定区域或目标进行操作,这个区域我们称之为感兴趣区域。opencv中mask的作用就是创建感兴趣区域,即待处理的区域。

          通常,mask大小创建分为两步,先创建与原图一致,类型为CV_8UC1或者CV_8UC3的全零图(即黑色图)。如mask = Mat::zeros(image.size(),CV_8UC1); 

       然后用rect类或者fillPoly()函数将原图中待处理的区域(感兴趣区域)置为1。


    具体用法可参考http://blog.csdn.net/dengtaocs/article/details/38022153http://blog.csdn.net/billbliss/article/details/43968291

    展开全文
  • 通过opencv保存成RBGA形式的png形式。背景为0、A通道为0时,为透明像素。 img = cv2.imread("mask.bmp", 0) ret_img = cv2.merge([img, img, img, img]) cv2.imwrite("ret.png", ret_img) 法二:保存为svg ...
  • 主要介绍了python使用opencv图像mask处理的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • python opencv 制作mask

    2020-05-27 11:13:54
    import cv2 import numpy as np import os def get_bbox(file_path): for subdir in os.listdir(file_path): ... mask_path=file_path+'_label/'+subdir if not os.path.exists(mask_path): os.makedirs(ma.
  • opencvmask图像合成扩充数据集

    千次阅读 2016-12-26 15:35:44
    opencv扩充图像训练数据集,图像合成。
  • Opencv——mask

    千次阅读 2012-08-13 21:34:42
    程序要求:请自备同大小同的图片两张,一张为原图srcImg,为三通道图片,另一张为mask图,为单通道图片。 下面是Opencv官方手册的对cvCopy的说明: Copy 拷贝一个数组给另一个数组  void cvCopy( const ...
  • 利用opencv添加mask

    千次阅读 2019-03-04 13:34:51
    注意np.where的妙用,其中r['masks']是(none,none,4)的ndarray形式的mask,通过取每一个channel盖在原图片上。   第二种做法: #coding:utf-8 import numpy as np import matplotlib.pyplot as ...
  • opencv通过mask掩码图合成两张图 此处两张图分别为纯色背景图和抠出来的人像图(背景是纯白色的) def composite(fg, bg, a, w, h): """ :param fg: 白色背景人像图,Image对象 :param bg: 纯色图,Image对象 :...
  • 探讨opencvmask的应用

    2015-11-16 12:43:35
    其实opencv 里面很多函数都是会带有一个mask 参数的,很多同学都不知道它到底有什么用,好像在实际运用中忽略它也没有什么问题(这不废话嘛,opencv设计师设计它的时候默认就是可以忽略的)。 我在这里就...
  • c++/python opencv实现mask Rcnn

    千次阅读 2018-12-29 14:29:23
    OpenCV中使用Mask R-CNN进行基于深度学习的对象检测和实例分割(Python / C ++) 我觉得可以尝试一下   几个星期前,我们用YOLOv3写了一篇关于物体检测的文章。 对象检测器的输出是在图像或视频帧中检测到的...
  • opencvmask操作

    千次阅读 2014-11-06 11:19:38
    其实opencv 里面很多函数都是会带有一个mask 参数的,很多同学都不知道它到底有什么用,好像在实际运用中忽略它也没有什么问题(这不废话嘛,opencv设计师设计它的时候默认就是可以忽略的)。 我在这里就抛砖引玉...
  • OpenCV中很多函数都带有一个mask参数,mask被称为掩模。图像掩模一般用来对处理的图像(全部或者局部)进行遮挡,来控制图像处理的区域或处理过程。 二、掩模原理 掩模一般是小于等于源图像的单通道矩阵,掩模中的值...
  • OpencvMask影像匀光算法实现

    千次阅读 2016-03-03 10:39:07
    **1.算法原理** 《数字正射影像镶嵌中色彩一致...opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include <iostream> using nam
  • 基于python和opencvmask抠图叠加

    千次阅读 2018-07-04 19:46:28
    # Now create a mask of logo and create its inverse mask also img2gray = cv . cvtColor ( img2 , cv . COLOR_BGR2GRAY ) ret , mask = cv . threshold ( img2gray , 254 , 255 , cv . THRESH_BINARY...
  • OpenCV通过MASK来实现抠图

    万次阅读 2016-04-02 22:23:01
    // masktest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" ...#include "opencv2/imgproc/imgproc.hpp" #include #include using namespace cv; using namespace std; int _tmain(int argc
  • python 使用opencv图像mask处理

    万次阅读 多人点赞 2017-11-17 12:48:12
    MASK图像掩膜处理在图像操作中有时候会用到掩膜处理,如果使用遍历法掩膜图像ROI区域对于python来讲是很慢的,所以我们要找到一种比较好的算法来实现掩膜处理。
  • 点击我爱计算机视觉标星,更快获取CVML新技术前几天OpenCV4.0-Alpha发布,其中新增实例分割Mask RCNN模型是这次发布的亮点之一。图像实例分割即将图像中目标检测出来并进...
  • 前面的遮罩(cv2.inRange()) 只能够将所需的颜色给显示出来,但是显示出来的是白色的一片,那么,如果需要将白色变成自己所需要的色彩,就需要用到图像的合并 import cv2 import numpy as np img = cv2.imread('Test....
  • opencvMask影像匀光算法实现

    千次阅读 2017-07-26 16:59:47
    //前边对原始图像进行了扩展,这里把对原始图像傅里叶变换取出,剔除扩展部分。 //这一步的目的仍然是为了显示。 现在我们有了重分布后的幅度图, //但是幅度值仍然超过可显示范围[0,1] 。我们使用 normalize...
  • 目录python一、图像叠加能够经过OpenCV函数cv.add()或简单地经过numpy操做添加两个图像,res = img1 + img2.两个图像应该具备相同的深度和类型,或者第二个图像能够是标量值.blogimport cv2import numpy as npimg1 =...
  • opencv mask的格式

    2012-09-12 19:13:56
    opencvmask的通道数为单通道
  • opencv C++ 图像任意mask做卷积 欢迎在评论区留下自己的意见呀! #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; /********************************...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,980
精华内容 7,592
关键字:

opencv图片mask