opencv中Mat_<uchar>的作用

大佬们,
Mat img1= imread(file_name,IMREAD_COLOR);
Mat_ img2(img1);
的作用是啥

c++

1个回答

第一行,声明一个Mat型变量(属于opencv) img1,并以彩色方式读取一幅图像, file name可以是相对地址或者绝对地址.
第二行,声明一个Mat型变量img2,并用img1来初始化img2,所以img1和img2都存贮着读取到的图片

zjh526204825
zjh526204825 回复tangxiaoren: 好的,明白了!谢谢大佬
6 个月之前 回复
tangxiaoren
tangxiaoren 回复zjh526204825: Mat_<uchar>是说明声明的图像是单通道的; 然后后面就是用img1来初始化img2;这就相当于 img1.copyTo(img2); 但是如果你运行这句话是有错误的,原因是两张图的通道数不一样.个人认为你的写法是不合理的,在用img1给img2 赋值之前先保证两个图片的类型相同.
6 个月之前 回复
tangxiaoren
tangxiaoren 回复zjh526204825: Mat_<uchar>是说明声明的图像是单通道的;
6 个月之前 回复
zjh526204825
zjh526204825 谢谢,我第2行写的是“Mat_<uchar>img2(img1);”,但是显示出来的是问题那样的,发出来之后没注意他把我的问题改动了,可以再解释一下第2行嘛!谢谢
6 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
OpenCV中Mat像素访问和赋值的问题

想调用opencv中的inpaint函数。关于inpaintMask,我想通过遍历srcImage中的每一个像素,当这个像素的三个通道值皆为0时,将inpaintMask该位置像素值置非0。 可是遍历和赋值像素的时候,VS会报错,麻烦各位帮我看看问题所在,谢谢!代码附在了下面,很简单,不难看懂! ``` #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/photo/photo.hpp> #include <iostream> using namespace cv; using namespace std; #define WINDOW_NAME1 "【原始图】" #define WINDOW_NAME2 "【修补后】" Mat srcImage1, inpaintMask; int main(int argc, char ** argv) { Mat srcImage = imread("1.jpg"); if(!srcImage.data) { printf("读取照片错误,请确定目录下是否有imread函数指定的图片存在!\n"); return false; } srcImage1 = srcImage.clone(); inpaintMask = Mat::zeros(srcImage1.size(), CV_8UC1); for(int u1 = 0; u1 < srcImage.rows; u1++) for(int v1 = 0; v1 < srcImage.cols; v1++) { if( srcImage.at<Vec3b>(u1,v1)[0] == 0 && srcImage.at<Vec3b>(u1,v1)[1] == 0 && srcImage.at<Vec3b>(u1,v1)[2] == 0 ) { inpaintMask.at<Vec3b>(u1,v1)[0] = 255; } } // 显示原图 imshow(WINDOW_NAME1, srcImage1); Mat inpaintedImage; inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA); imshow(WINDOW_NAME2, inpaintedImage); waitKey(); return 0; } ```

OpenCV转换到lab颜色空间的CV_32F类型Mat图像分通道处理uchar指针和float数据

转换到lab颜色空间CV-32F类型Mat图像,需要分通道处理,3个通道,l、a、b都是CV-32F类型的Mat数据,使用uchar指针进行像素访问,并将3个通道处理结果赋值给一个新的CV-32F类型Mat图像testSal。问题是3个通道的处理结果仍是float型,赋值给uchar指针指向的对象可能会存在数据精度损失,在调试的过程中发现数据的值有问题,麻烦高人指点下怎么解决,万分感激。 ![图片说明](https://img-ask.csdn.net/upload/201507/18/1437222898_698633.jpg) ![图片说明](https://img-ask.csdn.net/upload/201507/18/1437222897_674168.jpg) ![图片说明](https://img-ask.csdn.net/upload/201507/18/1437222923_467629.jpg)

OpenCV Mat对象使用数组数据块初始化

OpenCV的官网介绍Mat对象,共列出了25种基本的初始化方法。 其中,对于使用数组数据块的初始化方法官方给出的例子是 ``` double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}}; Mat M = Mat(3, 3, CV_64F, m).inv(); ``` _但是我这样初始化我的Mat对象,数据为什么不对呢 double m[][3] = {{1, 2, 3}, {3, 0, 9}, {1, 3, 8}}; Mat M(3, 3, CV_8U, m); 这样的方式初始化的Mat对象数据根本就不是m数组里面的数据啊。请教高手解答啊 _

arm opencv mat内存无法释放

我是在arm上运行的,我的测试代码如下: ``` #include<stdio.h> #include <opencv2/opencv.hpp> #include <opencv2/contrib/contrib.hpp> #include <string> using namespace cv; using namespace std; int main(int argc ,char* argv[]) { vector<Mat> matVec; //Mat tmpMat; IplImage* src; for(int i=0;i<100;++i) { Mat tmpMat; tmpMat.create(cvSize(256,256),CV_8UC1); for(int j=0;j<256;++j) for(int k=0;k<256;++k) { tmpMat.at<uchar>(j,k)=(i+j)%255; } matVec.push_back(tmpMat.clone()); } int index=100; system("free"); printf("Press any key to stop!"); getchar(); while(index>1) { matVec.at(index-1).release(); --index; } matVec.clear(); vector<Mat>(matVec).swap(matVec); system("free"); printf("Press any key to stop!"); getchar(); return 0; } ``` 运行效果如下图: ![图片说明](https://img-ask.csdn.net/upload/201506/15/1434338371_412530.jpg) 释放前后,内存并没有太大变化。我感到很困惑,这是什么原因呢?

opencv数据流转化成mat

http://www.opencv.org.cn/forum.php?mod=viewthread&tid=258341&extra=

opencv Mat矩阵元素的访问问题

double SAD = 0; Mat temp; temp = l - r; cout << "temp=" << endl; cout << temp << endl; //Mat t; temp = abs(temp); cout << "temp=" << endl; cout << temp << endl; for (int i = 0;i < temp.rows;i++) { uchar *t = temp.ptr<uchar>(i); for (int j=0;j < temp.cols;j++) { SAD = SAD + t[j];///////////这里这里这里 } } return SAD; 为啥我这样访问矩阵元素没成功,我的SAD没得到temp矩阵里面的元素累加和?我已经检验过我的temp矩阵,里面有值 还有: int SAD = 0; Mat temp; temp = l - r; cout << "temp=" << endl; cout << temp << endl; //Mat t; temp = abs(temp); cout << "temp=" << endl; cout << temp << endl; for (int i = 0;i < temp.rows;i++) { //uchar *t = temp.ptr<uchar>(i); for (int j=0;j < temp.cols;j++) { SAD = SAD + temp.at<uchar>(i, j);////中断中断中断 } } return SAD; 我用at函数会中断是怎么回事

Opencv里vector<Mat>的问题

比如说有个子函数(这应该是子函数吧),开头如下 ``` vector<Mat>CalculateIntegralHOG(Mat& srcMat) ``` 1.vector《Mat》表示Mat类函数吧,为什么要把它放在vector里? 2.Mat和Mat&的区别是什么?

OpenCV函数返回的简单问题

下面是一个OpenCV的小程序: ``` #include <opencv2/opencv.hpp> using namespace cv; using namespace std; template<typename _Tp> vector<_Tp> convertMat2Vector(const Mat &_t1f) { //_t1f.convertTo(t1f, CV_64F); return (vector<_Tp>)(_t1f.reshape(1, 1));//通道数不变,按行转为一行 } template<typename _Tp> cv::Mat convertVector2Mat(vector<_Tp> v,int cn,int rows) { cv::Mat mat = cv::Mat(v);//将vector变成一列的mat cv::Mat dest=mat.reshape(cn, rows); cout << "dest=\n" << dest << endl; return dest; } int main() { int arr[4][3] = { { 1, 1,1 },{ 2, 2,2 },{ 3, 3,3 },{ 4,4, 4 } }; cv::Mat srcData(4, 3, CV_8UC1, arr); cout << "srcData=\n"<< srcData<< endl; vector<uchar> v = convertMat2Vector<uchar>(srcData); cv::Mat dest =convertVector2Mat<uchar>(v,1, 4);//函数里的dest和还回dest的结果为什么不一样的呀? cout << "dest=\n" << dest << endl; system("pause"); waitKey(); return 0; } ``` 运行结果: ![图片说明](https://img-ask.csdn.net/upload/201805/09/1525835984_339212.png) 问题是:各位大神啊,我这哪里出问题?为什么函数里的dest和还回的dest的结果值为什么不一样的呀?

opencv下笛卡尔坐标图片转化为极坐标图片无法显示彩色图片

uchar interpolate_bilinear(cv::Mat& mat_src, double ri, int rf, int rc, double ti, int tf, int tc) { double inter_value = 0.0; if (rf == rc && tc == tf) { inter_value = mat_src.ptr<uchar>(rc)[tc]; } else if (rf == rc) { inter_value = (ti - tf) * mat_src.ptr<uchar>(rf)[tc] + (tc - ti) * mat_src.ptr<uchar>(rf)[tf]; } else if (tf == tc) { inter_value = (ri - rf) * mat_src.ptr<uchar>(rc)[tf] + (rc - ri) * mat_src.ptr<uchar>(rf)[tf]; } else { double inter_r1 = (ti - tf) * mat_src.ptr<uchar>(rf)[tc] + (tc - ti) * mat_src.ptr<uchar>(rf)[tf]; double inter_r2 = (ti - tf) * mat_src.ptr<uchar>(rc)[tc] + (tc - ti) * mat_src.ptr<uchar>(rc)[tf]; inter_value = (ri - rf) * inter_r2 + (rc - ri) * inter_r1; } return (uchar)inter_value; } bool cartesian_to_polar(cv::Mat& mat_c, cv::Mat& mat_p, int img_d) { int color_num = mat_c.channels(); cout << "color_num=" << color_num << endl; mat_p = cv::Mat::zeros(img_d, img_d, CV_8UC1); //mat_p = cv::Mat::zeros(img_d, img_d, CV_8UC3); //mat_p = cv::Mat::zeros(img_d, img_d, color_num); int line_len = mat_c.rows; int line_num = mat_c.cols; double delta_r = (2.0*line_len) / (img_d - 1); //半径因子 double delta_t = 2.0 * PI / line_num; //角度因子 double center_x = (img_d - 1) / 2.0; double center_y = (img_d - 1) / 2.0; for (int i = 0; i < img_d; i++) { for (int j = 0; j < img_d; j++) { double rx = j - center_x; //图像坐标转世界坐标 double ry = center_y - i; //图像坐标转世界坐标 double r = std::sqrt(rx*rx + ry*ry); if (r <= (img_d - 1) / 2.0) { double ri = r * delta_r; int rf = (int)std::floor(ri); int rc = (int)std::ceil(ri); if (rf < 0) { rf = 0; } if (rc >(line_len - 1)) { rc = line_len - 1; } double t = std::atan2(ry, rx); if (t < 0) { t = t + 2.0 * PI; } double ti = t / delta_t; int tf = (int)std::floor(ti); int tc = (int)std::ceil(ti); if (tf < 0) { tf = 0; } if (tc >(line_num - 1)) { tc = line_num - 1; } mat_p.ptr<uchar>(i)[j] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); /* mat_p.ptr<Vec3b>(i, j)[0] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); mat_p.ptr<Vec3b>(i, j)[1] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); mat_p.ptr<Vec3b>(i, j)[2] = interpolate_bilinear(mat_c, ri, rf, rc, ti, tf, tc); */ } } } return true; }

OpenCV中對vector<Mat>添加return返還

如題,小弟最近在做有關opencv的程式,是關於找出鏡頭畫面之藍色區域並且計算邊長與旋轉角度,由於有時跳出 vector subscript out of range 這段程式碼,後來發現是因為如果攝像機沒有出現目標設定之藍色區域,此時vector會超出他的範圍,如果我想添加一段判斷式在vector<Mat> channels; 這邊,判斷當vector範圍超出時返還,則該判別式 該如何寫? 小弟試過幾次結果並不成功,還請各位前輩指教一下,以下放是片段程式碼 int main() { VideoCapture cap(0); if (!cap.isOpened()) { cout << " Camera Has Been Opened !" << endl; return -1; } Mat frame; while (1) //儲存WebCam上面之畫面 { cap >> frame; imwrite("C:/Navigation/WebCam_Image.jpg", frame); if (frame.empty()) { cout << " Error Writing the Image !" << endl; return -4; } line(frame, Point(0, 240), Point(640, 240), Scalar(0, 255, 0), 1, CV_AA); line(frame, Point(320, 0), Point(320, 480), Scalar(0, 255, 0), 1, CV_AA); imshow("WebCam", frame); if (waitKey(1) == 27) { break; } } //Blue //留住 Mat srcImg, midImg, dstImg; srcImg = imread("C:/Navigation/WebCam_Image.jpg"); //C:/Lock Mouse/WebCam_Image.jpg //C:/Navigation/5.png Mat xianshi = srcImg.clone(); Mat redChannel, greenChannel, blueChannel; //namedWindow("【Original】", WINDOW_AUTOSIZE); //imshow("【Original】", srcImg); //0.灰階 Mat grayImg; vector<Mat> channels; split(srcImg, channels); //cvtColor(srcImg,grayImg,COLOR_BGR2GRAY); grayImg = channels.at(0); //對藍色區域取灰階圖 redChannel = channels.at(2); greenChannel = channels.at(1); blueChannel = channels.at(0); //namedWindow("【Blue 灰度圖】", WINDOW_AUTOSIZE); //imshow("【Blue 灰度圖】", grayImg); //1.均值濾波 blur(grayImg, grayImg, Size(20, 20), Point(-1, -1)); //namedWindow("【均值濾波後】", WINDOW_NORMAL); //imshow("【均值濾波後】", grayImg); //2.轉化為二值圖 Mat midImg1 = grayImg.clone(); int rowNumber = midImg1.rows; int colNumber = midImg1.cols; for (int i = 0; i < rowNumber; i++) //僅限定天藍色區域 { uchar* data = midImg1.ptr<uchar>(i); //取第i行的首地址 uchar* redData = redChannel.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) { if (data[j] > BIN_DIV&&redData[j] < BIN_DIV * 2 / 3) data[j] = 255; else data[j] = 0; } } namedWindow("【Blue 二值圖】", WINDOW_AUTOSIZE); imshow("【Blue 二值圖】", midImg1); Mat midImg2 = midImg1.clone(); Mat element = getStructuringElement(MORPH_RECT, Size(50, 50)); morphologyEx(midImg1, midImg2, MORPH_CLOSE, element); namedWindow("【Blue 開運算後】", WINDOW_AUTOSIZE); imshow("【Blue 開運算後】", midImg2); //cout << "midImg1.channel=" << midImg1.channels() << endl; //cout << "mdiImg1.depth" << midImg1.depth() << endl; //3.查找圖像輪廓 Mat midImg3 = Mat::zeros(midImg2.rows, midImg2.cols, CV_8UC3); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(midImg2, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); for (int index = 0; index >= 0; index = hierarchy[index][0]) { Scalar color(255, 255, 255); drawContours(midImg3, contours, index, color, NULL, 8, hierarchy); } //namedWindow("【輪廓圖】", WINDOW_NORMAL); //imshow("【輪廓圖】", midImg3); Mat midImg4 = midImg3.clone(); //4.創建包圍輪廓的矩形邊界 int cnt = 0; for (int i = 0; i < contours.size(); i++) { //float length, length2, midx, midy, midx2, midy2; static int length, length2, midx, midy, midx2, midy2; float ang, m, pixel_area, pixel_length, pixel_length2, dis; //每個輪廓 vector<Point> points = contours[i]; //對給定的2D點集,尋找最小面積的包圍矩形 RotatedRect box = minAreaRect(Mat(points)); Point2f vertex[4]; box.points(vertex); //繪製出最小面積的包圍矩形 line(xianshi, vertex[0], vertex[1], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[1], vertex[2], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[2], vertex[3], Scalar(100, 200, 211), 2, CV_AA); line(xianshi, vertex[3], vertex[0], Scalar(100, 200, 211), 2, CV_AA); //cout << " [" << i << "] (" << vertex[i].x << "," << vertex[i].y << ")" << endl; //印出座標 //總共 i 個圖形,共 4 * i 個交點 if (i == 0) { for (int i = 0; i < 4; i++) { circle(xianshi, Point(vertex[i].x, vertex[i].y), 8, Scalar(0, 255, 0), 1); //綠色實心角點 ** //將 4 * i 個交點儲存 vertexx[i] = vertex[i].x; vertexy[i] = vertex[i].y; } } else { for (int j = 0; j < 4; j++) { circle(xianshi, Point(vertex[j].x, vertex[j].y), 8, Scalar(0, 255, 0), 1); //綠色實心角點 ** //將 4*i 個交點儲存 vertexx[j + (i * 4)] = vertex[j].x; vertexy[j + (i * 4)] = vertex[j].y; } } //計算長度 pixel_length = sqrt((vertex[0].x - vertex[1].x)*(vertex[0].x - vertex[1].x) + (vertex[0].y - vertex[1].y)*(vertex[0].y - vertex[1].y)); midx = abs((vertex[0].x - vertex[1].x) / 2) + vertex[1].x; midy = abs((vertex[0].y - vertex[1].y) / 2) + vertex[1].y; pixel_length2 = sqrt((vertex[1].x - vertex[2].x)*(vertex[1].x - vertex[2].x) + (vertex[1].y - vertex[2].y)*(vertex[1].y - vertex[2].y)); //3.625 midx2 = abs((vertex[1].x - vertex[2].x) / 2) + vertex[1].x; midy2 = abs((vertex[1].y - vertex[2].y) / 2) + vertex[2].y; //Area pixel_area = pixel_length * pixel_length2; //cout << " Pixel_Length = " << pixel_length << " , Pixel_Length2 = " << pixel_length2 << endl; //cout << (" Pixel_Area ") << i << (" = ") << pixel_area << endl; mag = (pixel_length + pixel_length2) / (2 * 31); length = pixel_length / mag; length2 = pixel_length2 / mag; sprintf_s(text, "%dmm", length); putText(xianshi, text, Point(midx, midy), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** circle(xianshi, Point(midx, midy), 4, Scalar(0, 255, 0), 1); //綠色實心角點 ** sprintf_s(text, "%dmm", length2); putText(xianshi, text, Point(midx2, midy2), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** circle(xianshi, Point(midx2, midy2), 4, Scalar(0, 255, 0), 1); //綠色實心角點 ** //Angle m = (vertex[0].y - vertex[1].y) / (vertex[0].x - vertex[1].x); ang = atan(m)*(180 / pi); //cout << ("m = ") << m << endl; cout << (" Angle ") << i << (" = ") << 90 - ang << endl; //Distance dis = (6.15 * 110) / mag; cout << " Distance = " << dis << " mm" << endl; //mark sprintf_s(text, "%d", i); putText(xianshi, text, Point(midx + 50, midy + 50), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1); //** //繪製中心的光標 Point s1, l, r, u, d; s1.x = (vertex[0].x + vertex[2].x) / 2.0; s1.y = (vertex[0].y + vertex[2].y) / 2.0; l.x = s1.x - 10; l.y = s1.y; r.x = s1.x + 10; r.y = s1.y; u.x = s1.x; u.y = s1.y - 10; d.x = s1.x; d.y = s1.y + 10; line(xianshi, l, r, Scalar(255, 255, 255), 1, CV_AA); //水平 capx = r.x - 10; navx[i] = capx; line(xianshi, u, d, Scalar(255, 255, 255), 1, CV_AA); //垂直 capy = d.y - 10; navy[i] = capy; cout << (" Object Number = ") << i << (", Mid x = ") << capx << (", Mid y = ") << capy << endl; cout << endl; } for (int i = 0; i < contours.size(); i++) { navx[25]; navy[25]; //cout << ("i = ") << i << (", navx = ") << navx[i] << (", navy = ") << navy[i] << endl; }

OPENCV Mat类怎么对像素进行操作啊?

Mat srcImage = imread("1.jpg", 0); Mat dstImage; dstImage=srcImage.clone(); for (int rows= 1;rows <dstImage.rows; rows++) { for (int cols = 1;cols < dstImage.cols - 1; cols++) { ****** uchar*data = dstImage.ptr<uchar>((rows)+cols); uchar*updata = dstImage.ptr<uchar>((rows - 1) + cols); uchar*downdata = dstImage.ptr<uchar>((rows + 1) + cols);****** 我这星号标记的这三行有什么问题啊?能否指点啊,我还有个程序找三叉点也有问题,能否指点啊;求大神啊

#opencv数据类型转换#

使用的是matrix的模板,他的对象如何能转换成iplimage类型的,之前查找资料说matrix和mat差不多,为啥mat就能转成iplimage,而matrix找不到方法呢。。。。

Opencv中写入数据到内存

如何把Mat 类型的数据,压缩成jpeg并写入内存,比如说某个uchar数组.我知道用imwrite,可以实现 把Mat类型数据压缩成jpeg并写入文件.有没有哪位大神知道,将结果写入内存而不是文件?

【OpenCV】Mat类遍历像素 为什么不能 从图像下面到上面呢?

从上至下编译成功,但从下至上失败,为什么? 下面的循环代码需要怎么更改? //遍历灰度值 uchar* p; for (int i = rows; i >1; i--) { p = image.ptr<uchar>(i); //获取像素指针 for (int j = 0; j < cols - 4; j++) { //对满足一定条件的像素赋值 } }

opencv+cuda关于GpuMat数据转递问题

萌新刚刚接触opencv+cuda不久,还不是很熟练,现在碰到了一个问题,不知道有没有大佬知道解决方法 实际问题中我想定义一个GpuMat类型的数组,例如cv::cuda::GpuMat cu_proj[10][128]; 然后传递给核函数的时候就显示如下错误 error : no suitable constructor exists to convert from "cv::cuda::GpuMat [10][128]" to "cv::cuda::PtrStepSz<uchar1>" 我网上搜到的都是单个GpuMat的传递,不知道我这种情况有没有解决方法呀?以及如果有,在核函数中应该怎么索引呢?我试过cu_proj[x][y](i, y),也显示错误: error : no operator "[]" matches these operands 感激不尽!

opencv3.0.0出现无法解析的外部命令

opencv3.0.0出现无法解析的外部命令 头文件代码: #if !defined COLORDETECT #define COLORDETECT #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> class ColorDetector { private: // minimum acceptable distance int maxDist; // target color cv::Vec3b target; // image containing color converted image cv::Mat converted; bool useLab; // image containing resulting binary map cv::Mat result; public: // empty constructor // default parameter initialization here ColorDetector() : maxDist(100), target(0, 0, 0), useLab(false) {} // extra constructor for Lab color space example ColorDetector(bool useLab) : maxDist(100), target(0, 0, 0), useLab(useLab) {} // full constructor ColorDetector(uchar blue, uchar green, uchar red, int mxDist = 100, bool useLab = false) : maxDist(mxDist), useLab(useLab) { // target color setTargetColor(blue, green, red); } // Computes the distance from target color. int getDistanceToTargetColor(const cv::Vec3b& color) const { return getColorDistance(color, target); } // Computes the city-block distance between two colors. int getColorDistance(const cv::Vec3b& color1, const cv::Vec3b& color2) const { return abs(color1[0] - color2[0]) + abs(color1[1] - color2[1]) + abs(color1[2] - color2[2]); // Or: // return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-color2[0],color[1]-color2[1],color[2]-color2[2]))); // Or: // cv::Vec3b dist; // cv::absdiff(color,color2,dist); // return cv::sum(dist)[0]; } // Processes the image. Returns a 1-channel binary image. cv::Mat process(const cv::Mat &image); cv::Mat operator()(const cv::Mat &image) { cv::Mat input; input = image; if (useLab) { // Lab conversion cv::cvtColor(image, input, CV_BGR2Lab); } cv::Mat output; // compute absolute difference with target color cv::absdiff(input, cv::Scalar(target), output); // split the channels into 3 images std::vector<cv::Mat> images; cv::split(output, images); // add the 3 channels (saturation might occurs here) output = images[0] + images[1] + images[2]; // apply threshold cv::threshold(output, // input image output, // output image maxDist, // threshold (must be < 256) 255, // max value cv::THRESH_BINARY_INV); // thresholding type return output; } // Getters and setters // Sets the color distance threshold. // Threshold must be positive, otherwise distance threshold // is set to 0. void setColorDistanceThreshold(int distance) { if (distance < 0) distance = 0; maxDist = distance; } // Gets the color distance threshold int getColorDistanceThreshold() const { return maxDist; } // Sets the color to be detected void setTargetColor(uchar blue, uchar green, uchar red) { // BGR order target = cv::Vec3b(blue, green, red); if (useLab) { // Temporary 1-pixel image cv::Mat tmp(1, 1, CV_8UC3); tmp.at<cv::Vec3b>(0, 0) = cv::Vec3b(blue, green, red); // Converting the target to Lab color space cv::cvtColor(tmp, tmp, CV_BGR2Lab); target = tmp.at<cv::Vec3b>(0, 0); } } // Sets the color to be detected void setTargetColor(cv::Vec3b color) { target = color; } // Gets the color to be detected cv::Vec3b getTargetColor() const { return target; } }; #endif 主函数代码: #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/core/core.hpp> #include"colordetector.h" int main() { // 1. Create image processor object ColorDetector cdetect; // 2. Read input image cv::Mat image = cv::imread("Schluss.jpg"); if (image.empty()) return 0; // 3. Set input parameters cdetect.setTargetColor(250, 219, 133); // here blue sky // 4. Process the image and display the result cv::namedWindow("result"); cv::imshow("result", cdetect.process(image)); // or using functor ColorDetector colordetector(250, 219, 133, // color 45, true); // Lab threshold cv::namedWindow("result (functor)"); cv::imshow("result (functor)", colordetector(image)); cv::waitKey(); return 0; } 依赖的库添加了: D:\opencv\build\x64\vc12\lib\opencv_ts300.lib D:\opencv\build\x64\vc12\lib\opencv_world300.lib D:\opencv\build\x64\vc12\staticlib\opencv_imgproc300.lib D:\opencv\build\x64\vc12\staticlib\IlmImf.lib D:\opencv\build\x64\vc12\staticlib\ippicvmt.lib D:\opencv\build\x64\vc12\staticlib\libjpeg.lib D:\opencv\build\x64\vc12\staticlib\libpng.lib D:\opencv\build\x64\vc12\staticlib\libtiff.lib D:\opencv\build\x64\vc12\staticlib\libwebp.lib D:\opencv\build\x64\vc12\staticlib\opencv_calib3d300.lib D:\opencv\build\x64\vc12\staticlib\opencv_core300.lib D:\opencv\build\x64\vc12\staticlib\opencv_features2d300.lib D:\opencv\build\x64\vc12\staticlib\opencv_flann300.lib D:\opencv\build\x64\vc12\staticlib\opencv_hal300.lib D:\opencv\build\x64\vc12\staticlib\opencv_highgui300.lib D:\opencv\build\x64\vc12\staticlib\opencv_imgcodecs300.lib D:\opencv\build\x64\vc12\staticlib\opencv_imgproc300.lib D:\opencv\build\x64\vc12\staticlib\opencv_ml300.lib D:\opencv\build\x64\vc12\staticlib\opencv_objdetect300.lib D:\opencv\build\x64\vc12\staticlib\opencv_photo300.lib D:\opencv\build\x64\vc12\staticlib\opencv_shape300.lib D:\opencv\build\x64\vc12\staticlib\opencv_stitching300.lib D:\opencv\build\x64\vc12\staticlib\opencv_superres300.lib D:\opencv\build\x64\vc12\staticlib\opencv_video300.lib D:\opencv\build\x64\vc12\staticlib\opencv_videoio300.lib D:\opencv\build\x64\vc12\staticlib\opencv_videostab300.lib D:\opencv\build\x64\vc12\staticlib\zlib.lib 解决方案配置是Release x64 刚开始学OpenCV,请各位大佬帮帮我

opencv 操作像素报错 cv::Exception

我在网上看到了很多种方法去操作图中的像素,但是无论用哪个都出现这样的错误: 0x7611b727 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0039fa94 处的 cv::Exception。 编译是正确的。 我的代码: #include <iostream> #include <string> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> int main(int argc, char** argv) { //int i = 0; cv::Mat foreground; //for(int i = 0; i < 320; i++){ // for(int j = 0; j < 240; j++){ // foreground.at<cv::Vec3b>(i,j)[0] = 0; // foreground.at<cv::Vec3b>(i,j)[1] = 0; // foreground.at<cv::Vec3b>(i,j)[2] = 0; // foreground.at<uchar>(i,j) = 0; // } //} for (int j=0; j<foreground.rows; j++) { uchar* data= foreground.ptr<uchar>(j); for (int i=0; i<foreground.cols; i++) { data[i] = 255; } } //for(int i=0;i<foreground.rows;i++) // for(int j=0;j<foreground.cols;j++) // foreground.at<uchar>(i,j)=255; cv::imshow("video", foreground); return 0; } 里面种种被注释的也就是网上提到的一些方法。问题到底出在哪里了?没初始化么?可是我现在没注释掉的,就是逐像素赋值啊?我做的是运动目标跟踪,本来是在提取出运动区域以后(一张二值化的图)想根据运动区域的轮廓取出目标来,然后可以算直方图、角点什么的。在整体的代码里面,foreground是已经计算除的前景,所以也是有图像的,一样报错。 另外有哪位大神愿意被骚扰以后碰到问题直接问?求助啊

c++ /opencv 中的指针问题

float *it; lookupY = cv::Mat(1, height, CV_32F); it = lookupY.ptr<float>(); 程序中,it存储的是什么内容

cv::filestorage读写yml失败问题

跑opencv2.4.10或opencv2.4.9或opencv2.4.11中例程opencv\samples\cpp\tutorial_code\core\file_input_output\file_input_output.cpp int main(int ac, char** av) { if (ac != 2) { help(av); return 1; } string filename = av[1]; { //write Mat R = Mat_<uchar>::eye(3, 3), T = Mat_<double>::zeros(3, 1); MyData m(1); FileStorage fs(filename, FileStorage::WRITE); fs << "iterationNr" << 100; .......... } 代码中 FileStorage fs(filename, FileStorage::WRITE);话没有返回正确fs,调试的时候说fs是错误的指针,变量filename在命令参数中给出,已被正确赋值为q.yml,但没有产生q.yml。用fs.isopened检查文件状态返回0.该怎么正确读写yml文件 我的环境是windows10+vs2010+opencv2.4.10/opencv2.4.11/opencv/2.4.9.感觉我的电脑不能正常使用cv::filestorage这个类。cvfilestorage结构体可以正常读取 yml文件

程序员的兼职技能课

获取讲师答疑方式: 在付费视频第一节(触摸命令_ALL)片头有二维码及加群流程介绍 限时福利 原价99元,今日仅需39元!购课添加小助手(微信号:csdn590)按提示还可领取价值800元的编程大礼包! 讲师介绍: 苏奕嘉&nbsp;前阿里UC项目工程师 脚本开发平台官方认证满级(六级)开发者。 我将如何教会你通过【定制脚本】赚到你人生的第一桶金? 零基础程序定制脚本开发课程,是完全针对零脚本开发经验的小白而设计,课程内容共分为3大阶段: ①前期将带你掌握Q开发语言和界面交互开发能力; ②中期通过实战来制作有具体需求的定制脚本; ③后期将解锁脚本的更高阶玩法,打通任督二脉; ④应用定制脚本合法赚取额外收入的完整经验分享,带你通过程序定制脚本开发这项副业,赚取到你的第一桶金!

Windows版YOLOv4目标检测实战:训练自己的数据集

课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

lena全身原图(非256*256版本,而是全身原图)

lena全身原图(非256*256版本,而是全身原图) lena原图很有意思,我们通常所用的256*256图片是在lena原图上截取了头部部分的256*256正方形得到的. 原图是花花公子杂志上的一个

快速入门Android开发 视频 教程 android studio

这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

Java调用微信支付

Java 使用微信支付 一. 准备工作 1.

汽车租赁管理系统需求分析规格说明书

汽车租赁管理系统需求分析规格说明书,这只是一个模板,如果有不会的可以借鉴一下,还是蛮详细的。。。。

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

程序员的算法通关课:知己知彼(第一季)

【超实用课程内容】 程序员对于算法一直又爱又恨!特别是在求职面试时,算法类问题绝对是不可逃避的提问点!本门课程作为算法面试系列的第一季,会从“知己知彼”的角度,聊聊关于算法面试的那些事~ 【哪些人适合学习这门课程?】 求职中的开发者,对于面试算法阶段缺少经验 想了解实际工作中算法相关知识 在职程序员,算法基础薄弱,急需充电 【超人气讲师】 孙秀洋&nbsp;| 服务器端工程师 硕士毕业于哈工大计算机科学与技术专业,ACM亚洲区赛铜奖获得者,先后在腾讯和百度从事一线技术研发,对算法和后端技术有深刻见解。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/27272 移动端:CSDN 学院APP(注意不是CSDN APP哦) 本课程为录播课,课程无限观看时长,但是大家可以抓紧时间学习后一起讨论哦~

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

Python入门视频精讲

Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

我以为我对Mysql事务很熟,直到我遇到了阿里面试官

太惨了,面试又被吊打

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

Java62数据提取代码

利用苹果手机微信下面的wx.data文件提取出62数据,通过62可以实现不同设备直接登陆,可以通过文件流的方式用脚本上传到服务器进行解析

Python代码实现飞机大战

文章目录经典飞机大战一.游戏设定二.我方飞机三.敌方飞机四.发射子弹五.发放补给包六.主模块 经典飞机大战 源代码以及素材资料(图片,音频)可从下面的github中下载: 飞机大战源代码以及素材资料github项目地址链接 ————————————————————————————————————————————————————————— 不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每

2018年全国大学生计算机技能应用大赛决赛 大题

2018年全国大学生计算机技能应用大赛决赛大题,程序填空和程序设计(侵删)

Lena图像处理测试专业用图,高清完整全身原图

Lena图像处理测试专业用图,高清完整全身原图,该图片很好的包含了平坦区域、阴影和纹理等细节,这些都有益于测试各种不同的图像处理算法。它是一幅很好的测试照片!其次,由于这是一个非常有魅力女人的照片。

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

verilog实现地铁系统售票

使用 verilog 实现地铁售票

Python+OpenCV计算机视觉

Python+OpenCV计算机视觉系统全面的介绍。

Python可以这样学(第四季:数据分析与科学计算可视化)

董付国老师系列教材《Python程序设计(第2版)》(ISBN:9787302436515)、《Python可以这样学》(ISBN:9787302456469)配套视频,在教材基础上又增加了大量内容,通过实例讲解numpy、scipy、pandas、statistics、matplotlib等标准库和扩展库用法。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

获取Linux下Ftp目录树并逐步绑定到treeview

在linux下抓取目录树,双击后获取该节点子节点(逐步生成)。另外有两个类,一个是windows下的(一次性获取目录树),一个是linux下的(足部获取目录树)

YOLOv3目标检测实战系列课程

《YOLOv3目标检测实战系列课程》旨在帮助大家掌握YOLOv3目标检测的训练、原理、源码与网络模型改进方法。 本课程的YOLOv3使用原作darknet(c语言编写),在Ubuntu系统上做项目演示。 本系列课程包括三门课: (1)《YOLOv3目标检测实战:训练自己的数据集》 包括:安装darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 (2)《YOLOv3目标检测:原理与源码解析》讲解YOLOv1、YOLOv2、YOLOv3的原理、程序流程并解析各层的源码。 (3)《YOLOv3目标检测:网络模型改进方法》讲解YOLOv3的改进方法,包括改进1:不显示指定类别目标的方法 (增加功能) ;改进2:合并BN层到卷积层 (加快推理速度) ; 改进3:使用GIoU指标和损失函数 (提高检测精度) ;改进4:tiny YOLOv3 (简化网络模型)并介绍 AlexeyAB/darknet项目。

手把手实现Java图书管理系统(附源码)

【超实用课程内容】 本课程演示的是一套基于Java的SSM框架实现的图书管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的java人群。详细介绍了图书管理系统的实现,包括:环境搭建、系统业务、技术实现、项目运行、功能演示、系统扩展等,以通俗易懂的方式,手把手的带你从零开始运行本套图书管理系统,该项目附带全部源码可作为毕设使用。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/27513 移动端:CSDN 学院APP(注意不是CSDN APP哦) 本课程为录播课,课程2年有效观看时长,大家可以抓紧时间学习后一起讨论哦~ 【学员专享增值服务】 源码开放 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化

微信小程序开发实战之番茄时钟开发

微信小程序番茄时钟视频教程,本课程将带着各位学员开发一个小程序初级实战类项目,针对只看过官方文档而又无从下手的开发者来说,可以作为一个较好的练手项目,对于有小程序开发经验的开发者而言,可以更好加深对小程序各类组件和API 的理解,为更深层次高难度的项目做铺垫。

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从 2009 年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢? 说回面试的事,这份面试...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

微信小程序 实例汇总 完整项目源代码

微信小程序 实例汇总 完整项目源代码

基于西门子S7—1200的单部六层电梯设计程序,1部6层电梯

基于西门子S7—1200的单部六层电梯设计程序,1部6层电梯。 本系统控制六层电梯, 采用集选控制方式。 为了完成设定的控制任务, 主要根据电梯输入/输出点数确定PLC 的机型。 根据电梯控制的要求,

相关热词 c#分级显示数据 c# 不区分大小写替换 c#中调用就java c#正则表达式 验证小数 c# vscode 配置 c#三维数组能存多少数据 c# 新建excel c#多个文本框 c#怎么创建tcp通讯 c# mvc 电子病例
立即提问