烧录图像控制屏幕灯珠方式
实验流程:
- 相机拍图;
- 算法处理:定位、亮度提取、灰阶补偿
{补偿:1、虚拟补偿,生成烧录图片… 2、烧录补偿,根据亮度提取的结果,生成hex; - 补偿后生成补偿烧录图片;
- 把烧录图像烧进PG,点屏显示,看效果;
单个灯珠点亮
// 20200710.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int wid = 2436, het = 752;
#pragma region [单独点点亮]
Mat point = Mat(wid, het, CV_8UC3, Scalar(0, 0, 0));
int m = 0, n = 0, k = 0,i, j;
//(m,n)是PG图像上的像素点,k是RGB三通道中的某一通道;
//(i,j)是屏幕灯珠位置;
//若要点亮屏幕上某一个灯珠;
cin >> i >> j;
m = i;
n = j / 3;
k = 2 - j % 3;
point.at<Vec3b>(m, n)[k] = 255;
imwrite("D:\\资料\\point.bmp", point);
#pragma endregion
return 0;
}
生成PG图像 RGB三通道
// 20200709.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int wid = 2436, het = 752;
Mat W = Mat(wid, het, CV_8UC3, Scalar(255, 255, 255));
Mat R = Mat(wid, het, CV_8UC3, Scalar(0, 0, 0));
Mat G = Mat(wid, het, CV_8UC3, Scalar(0, 0, 0));
Mat B = Mat(wid, het, CV_8UC3, Scalar(0, 0, 0));
/*
烧录(PG)图像的一个像素为(B,G,R)三通道,控制三个灯珠;
(1)
BGR BGR BGR BGR --->R B R B R B
G G G G G G
BGR BGR BGR BGR --->B R B R B R
G G G G G G
(2)对应位置表达式
PG图像的像素位置(m,n),RGB位置为K
对应的屏幕灯珠的位置(i,j)
m=i
3n+2-k=j
反之,
n=j/3
k=2-j%3
注:OpenCV中为三通道为BGR,生成PG图像时时注意!
*/
#pragma region [白色区域]
//白色背景
imwrite("D:\\资料\\W.bmp", W);
#pragma endregion
#pragma region [红色区域]
//红色背景
for (int i = 0; i < wid; i++)
{
if (!(i % 2))
{
int j = 0;
while (j < het)
{
R.at<Vec3b>(i, j)[2] = 255;
j += 4;
}
j = 1;
while (j < het)
{
R.at<Vec3b>(i, j)[1] = 255;
j += 4;
}
j = 2;
while (j < het)
{
R.at<Vec3b>(i, j)[0] = 255;
j += 4;
}
}
if (i % 2)
{
int j = 0;
while (j < het)
{
R.at<Vec3b>(i, j)[0] = 255;
j += 4;
}
j = 2;
while (j < het)
{
R.at<Vec3b>(i, j)[2] = 255;
j += 4;
}
j = 3;
while (j < het)
{
R.at<Vec3b>(i, j)[1] = 255;
j += 4;
}
}
}
imwrite("D:\\资料\\R.bmp", R);
#pragma endregion
#pragma region [绿色区域]
//绿色背景
for (int i = 0; i < wid; i++)
{
int j = 0;
while (j < het)
{
G.at<Vec3b>(i, j)[1] = 255;
j += 2;
}
j = 1;
while (j < het)
{
G.at<Vec3b>(i, j)[0] = 255;
G.at<Vec3b>(i, j)[2] = 255;
j += 2;
}
}
imwrite("D:\\资料\\G.bmp", G);
#pragma endregion
#pragma region [蓝色区域]
//蓝色背景
for (int i = 0; i < wid; i++)
{
if (i % 2)
{
int j = 0;
while (j < het)
{
B.at<Vec3b>(i, j)[2] = 255;
j += 4;
}
j = 1;
while (j < het)
{
B.at<Vec3b>(i, j)[1] = 255;
j += 4;
}
j = 2;
while (j < het)
{
B.at<Vec3b>(i, j)[0] = 255;
j += 4;
}
}
if (!(i % 2))
{
int j = 0;
while (j < het)
{
B.at<Vec3b>(i, j)[0] = 255;
j += 4;
}
j = 2;
while (j < het)
{
B.at<Vec3b>(i, j)[2] = 255;
j += 4;
}
j = 3;
while (j < het)
{
B.at<Vec3b>(i, j)[1] = 255;
j += 4;
}
}
}
imwrite("D:\\资料\\B.bmp", B);
#pragma endregion
waitKey(0);
return 0;
}