我在我的测试应用程序中成功实现了OpenCV平方检测示例,但现在需要过滤输出,因为它非常混乱 - 或者我的代码是错误的?
我对本文的四个角点感兴趣,以减少偏斜(如此)和进一步处理......
原始图片:
码:
double angle( cv::Point pt1, cv::Point pt2, cv::Point pt0 ) {
double dx1 = pt1.x - pt0.x;
double dy1 = pt1.y - pt0.y;
double dx2 = pt2.x - pt0.x;
double dy2 = pt2.y - pt0.y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}
- (std::vector<std::vector<cv::Point> >)findSquaresInImage:(cv::Mat)_image
{
std::vector<std::vector<cv::Point> > squares;
cv::Mat pyr, timg, gray0(_image.size(), CV_8U), gray;
int thresh = 50, N = 11;
cv::pyrDown(_image, pyr, cv::Size(_image.cols/2, _image.rows/2));
cv::pyrUp(pyr, …
Run Code Online (Sandbox Code Playgroud) 我想制作一个类似凸轮扫描仪的应用程序来裁剪文档.
但我需要像我的两个图像一样的功能..
第一张图像显示相机拍摄的图像..
第二个图像像这样识别捕获的图像部分.
我研究得越来越多,但没有得到任何外出,所以,我在这里问,是否有任何人这样做告诉我..
谢谢
我有一个像这样的形象:
我想删除数字周围的黑色行和列.所以我希望结果如下:
我试试这个:
void findX(IplImage* imgSrc,int* min, int* max){
int i;
int minFound=0;
CvMat data;
CvScalar maxVal=cvRealScalar(imgSrc->width * 255);
CvScalar val=cvRealScalar(0);
//For each col sum, if sum < width*255 then we find the min
//then continue to end to search the max, if sum< width*255 then is new max
for (i=0; i< imgSrc->width; i++){
cvGetCol(imgSrc, &data, i);
val= cvSum(&data);
if(val.val[0] < maxVal.val[0]){
*max= i;
if(!minFound){
*min= i;
minFound= 1;
}
}
}
}
void findY(IplImage* imgSrc,int* min, int* max){
int …
Run Code Online (Sandbox Code Playgroud) 要跟踪视频帧上的对象,首先我从视频中提取图像帧并将这些图像保存到文件夹中.然后我应该处理这些图像以找到一个对象.实际上我不知道这是否是实用的,因为所有的算法都是一步完成的.它是否正确?
如果方块在图像中连接了区域,我该如何检测它们.
我测试了OpenCV C++/Obj-C中提到的方法 :高级方形检测
它运作不佳.
有什么好主意吗?
import cv2
import numpy as np
def angle_cos(p0, p1, p2):
d1, d2 = (p0-p1).astype('float'), (p2-p1).astype('float')
return abs( np.dot(d1, d2) / np.sqrt( np.dot(d1, d1)*np.dot(d2, d2) ) )
def find_squares(img):
squares = []
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow("gray", gray)
gaussian = cv2.GaussianBlur(gray, (5, 5), 0)
temp,bin = cv2.threshold(gaussian, 80, 255, cv2.THRESH_BINARY)
# cv2.imshow("bin", bin)
contours, hierarchy = cv2.findContours(bin, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours( gray, contours, -1, (0, 255, 0), 3 )
#cv2.imshow('contours', gray)
for cnt …
Run Code Online (Sandbox Code Playgroud) python opencv image-processing object-detection computer-vision
我有一个背景场景的图像和前面有物体的同一场景的图像.现在我想用背景减法创建前景中对象的蒙版.两个图像都是RGB.
我已经创建了以下代码:
cv::Mat diff;
diff.create(orgImage.dims, orgImage.size, CV_8UC3);
diff = abs(orgImage-refImage);
cv::Mat mask(diff.rows, diff.cols, CV_8U, cv::Scalar(0,0,0));
//mask = (diff > 10);
for (int j=0; j<diff.rows; j++) {
// get the address of row j
//uchar* dataIn= diff.ptr<uchar>(j);
//uchar* dataOut= mask.ptr<uchar>(j);
for (int i=0; i<diff.cols; i++) {
if(diff.at<cv::Vec3b>(j,i)[0] > 30 || diff.at<cv::Vec3b>(j,i)[1] > 30 || diff.at<cv::Vec3b>(j,i)[2] > 30)
mask.at<uchar>(j,i) = 255;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道我这样做是否正确?
我有一个OpenCV应用程序来自办公室内部的网络摄像头流(很多细节),我必须找到一个人工标记.标记是在白色背景的一个黑角规.我使用Canny来查找边缘和cvFindContours进行轮廓加工,然后使用aboutPolyDP和co.用于过滤和查找候选者,然后使用局部直方图进一步过滤,bla bla bla ...
这或多或少有效,但不完全是我想要的.FindContours总是返回一个闭环,即使Canny创建一个非闭合线.我得到一个轮廓走在线的两侧形成一个环.对于坎尼图像(我的标记)上封闭的边缘,我得到2个轮廓,一个在里面,和其他在外面.我不得不对这个操作有问题:
我为每个标记得到2个轮廓(不是那么严重)
最简单的过滤是不可用的(拒绝非闭合轮廓)
所以我的问题是:是否可以为非封闭的Canny边缘获得非闭合轮廓? 或者解决上述两个问题的标准方法是什么?
Canny是一个非常好的工具,但我需要一种方法将2D黑白图像转换为易于处理的东西.类似连接组件的东西,列出组件的步行顺序中的所有像素.所以我可以过滤循环,并将其提供给approxPolyDP.
更新:我错过了一些重要的细节:标记可以处于任何方向(它不是面向摄像机的正面,没有直角),实际上我正在做的是3D方向估计,基于标记的2D投影.
我对计算机视觉和opencv库非常陌生.
我已经做了一些谷歌搜索试图找到如何从Point2fs的矢量创建一个新的图像,并没有找到任何有效的例子.我见过vector<Point>
,Mat
但是当我使用这些例子时,我总是会遇到错误.
我正在从这个例子工作,任何帮助将不胜感激.
代码:我通过了occludedSquare.
resize(occludedSquare, occludedSquare, Size(0, 0), 0.5, 0.5);
Mat occludedSquare8u;
cvtColor(occludedSquare, occludedSquare8u, CV_BGR2GRAY);
//convert to a binary image. pixel values greater than 200 turn to white. otherwize black
Mat thresh;
threshold(occludedSquare8u, thresh, 170.0, 255.0, THRESH_BINARY);
GaussianBlur(thresh, thresh, Size(7, 7), 2.0, 2.0);
//Do edge detection
Mat edges;
Canny(thresh, edges, 45.0, 160.0, 3);
//Do straight line detection
vector<Vec2f> lines;
HoughLines( edges, lines, 1.5, CV_PI/180, 50, 0, 0 );
//imshow("thresholded", edges);
cout << "Detected " …
Run Code Online (Sandbox Code Playgroud) 我正在尝试检测视频中的白色物体.第一步是过滤图像,使其只留下白色像素.我的第一种方法是使用HSV色彩空间然后检查高水平的VAL通道.这是代码:
//convert image to hsv
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
for(int x=0;x<srcSize.width;x++){
for(int y=0;y<srcSize.height;y++){
uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x];
uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x];
uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x];
if((*val>170))
*hue=255;
else
*hue=0;
}
}
Run Code Online (Sandbox Code Playgroud)
将结果留在色调通道中.不幸的是,这种方法对照明非常敏感.我相信有更好的方法.有什么建议?
我findContours
用于斑点检测.现在我将密切和类似的blob合并在一起.
以下是一些示例图片:
普通的Opencv有可能吗?
是否有任何opencv函数,如"cvHoughCircles()",可以用于圆检测程序的方检测程序,即CvSeq*circles = cvHoughCircles(),但我找不到方形检测.
我想用OpenCV和C++检测视频或图像中的红色对象.有什么算法可以做到这一点?
我想比较一下颜色的关系.实际上,当亮度变化时,比率保持不变.所以我想确定感兴趣区域颜色的可接受值的间隔.
对于情况,我看红R(x,y)和G(x,y)/ R(x,y)和B(x,y)/ R(x,y).
然后,我将找到可接受值的范围:为了获得第一个想法,它从调色板图像红色中释放每个报告的最大值和最小值
我想找到这样的东西:
如果minR <= R(x,y)<= maxR且minG <= G(x,y)<= maxG minB <= B(x,y)<= maxB so couleur(x,y)= blanc else couleur( X,Y)= NOIR
从打开cv的相机我可以得到一个红十字(见下图),我不知道计算交叉中心坐标(x,y)的最佳方法?我们可以假设激光是红色的.
可能我将不得不使用某种物体识别.但我需要计算它的中心,性能很重要.
有人可以帮忙吗?
我已成立了如何找到的图片,但在这种情况下,中心搜索最红的像素激光指示器(红点坐标)并不总是最红(整条生产线是红色,有时简历计算,它比中心更红).